evomeme 0.1.8 → 0.1.9-beta.14

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 (102) hide show
  1. package/dist/canvas-public/app.js +7264 -702
  2. package/dist/canvas-public/assets/presets/catalog.json +47 -0
  3. package/dist/canvas-public/assets/presets/tiles/A_01_CaoDi.png +0 -0
  4. package/dist/canvas-public/assets/presets/tiles/A_02_ShaMo.png +0 -0
  5. package/dist/canvas-public/assets/presets/tiles/A_03_TianKong.png +0 -0
  6. package/dist/canvas-public/assets/presets/tiles/A_04_ShuiBo.png +0 -0
  7. package/dist/canvas-public/assets/presets/tiles/A_05_HaiMian.png +0 -0
  8. package/dist/canvas-public/assets/presets/tiles/A_06_MuDiBan.png +0 -0
  9. package/dist/canvas-public/assets/presets/tiles/A_07_ShiZhuan.png +0 -0
  10. package/dist/canvas-public/assets/presets/tiles/A_08_AnRongYan.png +0 -0
  11. package/dist/canvas-public/assets/presets/tiles/A_09_QingTaiShi.png +0 -0
  12. package/dist/canvas-public/assets/presets/tiles/A_10_ShenHai.png +0 -0
  13. package/dist/canvas-public/assets/presets/tiles/A_11_HuiYanShi.png +0 -0
  14. package/dist/canvas-public/assets/presets/tiles/A_12_HongTu.png +0 -0
  15. package/dist/canvas-public/assets/presets/tiles/A_13_GengDi.png +0 -0
  16. package/dist/canvas-public/assets/presets/tiles/A_14_HuoShanYan.png +0 -0
  17. package/dist/canvas-public/assets/presets/tiles/A_15_NiTu.png +0 -0
  18. package/dist/canvas-public/assets/presets/tiles/A_16_HuangSha.png +0 -0
  19. package/dist/canvas-public/assets/presets/tiles/A_17_CongLin.png +0 -0
  20. package/dist/canvas-public/assets/presets/tiles/A_18_ZiYanShi.png +0 -0
  21. package/dist/canvas-public/assets/presets/tiles/A_19_MoGuTu.png +0 -0
  22. package/dist/canvas-public/assets/presets/tiles/A_20_HuaDian.png +0 -0
  23. package/dist/canvas-public/assets/presets/tiles/A_21_HaiLang.png +0 -0
  24. package/dist/canvas-public/assets/presets/tiles/A_22_GanTu.png +0 -0
  25. package/dist/canvas-public/assets/presets/tiles/A_23_QingTaiShiBan.png +0 -0
  26. package/dist/canvas-public/assets/presets/tiles/A_24_XingKong.png +0 -0
  27. package/dist/canvas-public/assets/presets/tiles/A_25_MoFaFuWen.png +0 -0
  28. package/dist/canvas-public/assets/presets/tiles/A_26_ShiTuYeDi.png +0 -0
  29. package/dist/canvas-public/assets/presets/tiles/A_27_LanZhuan.png +0 -0
  30. package/dist/canvas-public/assets/presets/tiles/A_28_HongZhuan.png +0 -0
  31. package/dist/canvas-public/assets/presets/tiles/A_29_YueQiu.png +0 -0
  32. package/dist/canvas-public/assets/presets/tiles/A_30_JinShuGe.png +0 -0
  33. package/dist/canvas-public/assets/presets/tiles/A_31_JinShuJingGai.png +0 -0
  34. package/dist/canvas-public/assets/presets/tiles/A_32_ShuZiChuang.png +0 -0
  35. package/dist/canvas-public/color-key-worker.js +280 -0
  36. package/dist/canvas-public/image-canvas-size-editor.js +254 -0
  37. package/dist/canvas-public/index.html +188 -25
  38. package/dist/canvas-public/perfect-pixel-worker.js +499 -0
  39. package/dist/canvas-public/styles.css +3570 -864
  40. package/dist/canvas-public/tile-map-editor.js +2120 -0
  41. package/dist/canvas-public/ui-controls.js +95 -0
  42. package/dist/canvas-public/vendor/pixi-tilemap.js +126 -0
  43. package/dist/canvas-public/vendor/pixi.min.js +2340 -0
  44. package/dist/index.js +29581 -2110
  45. package/dist/stage-blender/bake_materials.py +102 -0
  46. package/dist/stage-blender/export_scene.py +275 -0
  47. package/dist/stage-blender/preview_camera.py +90 -0
  48. package/dist/stage-blender/repair_mesh.py +112 -0
  49. package/dist/stage-public/app.js +759 -0
  50. package/dist/stage-public/baked/bakePilot.js +44 -0
  51. package/dist/stage-public/baked/bakedScene.js +129 -0
  52. package/dist/stage-public/baked/sceneAppearance.js +225 -0
  53. package/dist/stage-public/baked/sceneCamera.js +45 -0
  54. package/dist/stage-public/comparison-contract.js +28 -0
  55. package/dist/stage-public/delivery.html +4 -0
  56. package/dist/stage-public/delivery.js +17 -0
  57. package/dist/stage-public/godot/appearance.gd +170 -0
  58. package/dist/stage-public/godot/preview.gd +79 -0
  59. package/dist/stage-public/index.html +141 -0
  60. package/dist/stage-public/review-app.js +289 -0
  61. package/dist/stage-public/review-runtime.js +63 -0
  62. package/dist/stage-public/review.css +24 -0
  63. package/dist/stage-public/review.html +47 -0
  64. package/dist/stage-public/scene-runtime.js +212 -0
  65. package/dist/stage-public/sceneContractRuntime.js +235 -0
  66. package/dist/stage-public/styles.css +328 -0
  67. package/dist/stage-public/three-appearance.js +104 -0
  68. package/dist/stage-public/vendor/three170/LICENSE +21 -0
  69. package/dist/stage-public/vendor/three170/build/three.module.js +54571 -0
  70. package/dist/stage-public/vendor/three170/examples/jsm/controls/OrbitControls.js +1523 -0
  71. package/dist/stage-public/vendor/three170/examples/jsm/environments/RoomEnvironment.js +144 -0
  72. package/dist/stage-public/vendor/three170/examples/jsm/libs/fflate.module.js +2672 -0
  73. package/dist/stage-public/vendor/three170/examples/jsm/loaders/EXRLoader.js +2563 -0
  74. package/dist/stage-public/vendor/three170/examples/jsm/loaders/GLTFLoader.js +4727 -0
  75. package/dist/stage-public/vendor/three170/examples/jsm/utils/BufferGeometryUtils.js +1373 -0
  76. package/dist/tile-transition-mask.svg +40 -0
  77. package/package.json +77 -69
  78. package/skills/evomeme-cover/SKILL.md +1 -1
  79. package/skills/evomeme-game-maker/SKILL.md +83 -83
  80. package/skills/game-asset-align/SKILL.md +45 -0
  81. package/skills/game-asset-align/agents/openai.yaml +8 -0
  82. package/skills/game-asset-align/references/alignment-contract.md +61 -0
  83. package/skills/game-asset-align/references/blender-scene-pipeline.md +45 -0
  84. package/skills/game-asset-align/references/canonical-package.md +26 -0
  85. package/skills/game-asset-align/references/engine-capabilities.md +14 -0
  86. package/skills/game-asset-align/references/lightweight-review.md +32 -0
  87. package/skills/game-asset-align/references/repair-policy.md +30 -0
  88. package/skills/game-asset-align/references/tool-contract.md +39 -0
  89. package/skills/game-asset-align/references/visual-review.md +26 -0
  90. package/skills/game-asset-image-generator/SKILL.md +1 -1
  91. package/skills/godot-3d-game/SKILL.md +39 -0
  92. package/skills/godot-3d-game/agents/openai.yaml +8 -0
  93. package/skills/godot-3d-game/references/alignment-gates.md +26 -0
  94. package/skills/godot-3d-game/references/appearance-alignment.md +52 -0
  95. package/skills/godot-3d-game/references/build-and-qa.md +22 -0
  96. package/skills/godot-3d-game/references/canonical-asset-runtime.md +27 -0
  97. package/skills/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
  98. package/skills/godot-3d-game/references/physics-colliders.md +13 -0
  99. package/skills/godot-3d-game/references/project-structure.md +22 -0
  100. package/skills/godot-3d-game/references/skeleton-animation.md +16 -0
  101. package/skills/threejs-3d-game/SKILL.md +6 -2
  102. package/skills/threejs-3d-game/references/engine-asset-pipeline.md +52 -15
@@ -38,19 +38,48 @@
38
38
  <button type="button" class="ghost-btn" id="inspector-close" title="取消选中">×</button>
39
39
  </header>
40
40
  <div class="inspector-body" id="inspector-body"></div>
41
+ <div
42
+ class="inspector-resize-handle"
43
+ id="inspector-resize-handle"
44
+ role="separator"
45
+ aria-label="调整左侧栏宽度"
46
+ aria-orientation="vertical"
47
+ tabindex="0"
48
+ ></div>
41
49
  </aside>
42
50
  <div class="canvas-main">
43
51
  <div class="canvas-shell">
44
52
  <div class="canvas-toolbar">
53
+ <span class="product-brand">EVOMEME</span>
45
54
  <div class="project-bar">
46
55
  <span class="project-name" id="project-name" title="">未打开工程</span>
47
56
  <button type="button" class="ghost-btn" id="switch-project-btn">切换工程</button>
48
57
  </div>
49
58
  <div class="toolbar-actions" id="toolbar-actions">
50
- <button type="button" class="tool-btn" id="tool-add-assets">添加素材</button>
51
- <button type="button" class="tool-btn" id="tool-image-gen" title="拖到画布指定位置创建图片生成元素">图片生成</button>
52
- <button type="button" class="tool-btn" id="tool-video-gen" title="拖到画布指定位置创建视频生成元素">视频生成</button>
53
- <button type="button" class="ghost-btn" id="reset-view">重置视图</button>
59
+ <div class="toolbar-primary" role="tablist" aria-label="画布功能分类">
60
+ <button type="button" class="toolbar-primary-button toolbar-category-tab" id="tool-add-assets" role="tab" aria-selected="false" aria-expanded="false" aria-controls="toolbar-asset-tools"><span>添加素材</span><i class="toolbar-category-indicator" aria-hidden="true"></i></button>
61
+ <button type="button" class="toolbar-primary-button toolbar-category-tab" id="toolbar-image-tab" role="tab" aria-selected="false" aria-expanded="false" aria-controls="toolbar-image-tools"><span>图片生成</span><i class="toolbar-category-indicator" aria-hidden="true"></i></button>
62
+ <button type="button" class="toolbar-primary-button toolbar-category-tab" id="toolbar-video-tab" role="tab" aria-selected="false" aria-expanded="false" aria-controls="toolbar-video-tools"><span>视频生成</span><i class="toolbar-category-indicator" aria-hidden="true"></i></button>
63
+ </div>
64
+ <div class="toolbar-ribbon" id="toolbar-ribbon" hidden>
65
+ <div class="toolbar-ribbon-panel" id="toolbar-asset-tools" role="tabpanel" hidden>
66
+ <button type="button" class="toolbar-ribbon-tool toolbar-ribbon-action" id="tool-local-assets" title="从本地选择图片或视频"><span>本地导入</span></button>
67
+ <button type="button" class="toolbar-ribbon-tool" id="tool-official-assets" title="拖到画布指定位置打开官方素材库"><span>官方素材</span></button>
68
+ </div>
69
+ <div class="toolbar-ribbon-panel" id="toolbar-image-tools" role="tabpanel" hidden>
70
+ <button type="button" class="toolbar-ribbon-tool" id="tool-image-gen" title="拖到画布指定位置创建图片生成元素"><span>图片生成</span></button>
71
+ <button type="button" class="toolbar-ribbon-tool" id="tool-game-ui-gen" title="拖到画布指定位置创建游戏 UI 组件生成元素"><span>游戏 UI 组件生成</span></button>
72
+ <button type="button" class="toolbar-ribbon-tool" id="tool-four-view" title="拖到画布指定位置创建空白四视图生成元素"><span>角色四视图生成</span></button>
73
+ <button type="button" class="toolbar-ribbon-tool" id="tool-eight-direction" title="拖到画布指定位置创建空白八方图生成元素"><span>角色八方图生成</span></button>
74
+ <button type="button" class="toolbar-ribbon-tool" id="tool-seamless-tile-gen" title="拖到画布指定位置创建无缝地块生成元素"><span>无缝地块生成</span></button>
75
+ <button type="button" class="toolbar-ribbon-tool" id="tool-tile-transition-atlas" title="拖到画布指定位置创建无缝地块集生成元素"><span>无缝地块集生成</span></button>
76
+ <button type="button" class="toolbar-ribbon-tool" id="tool-tile-map" title="先设置文件夹和瓦片分辨率,再创建地图"><span>地图绘制</span></button>
77
+ </div>
78
+ <div class="toolbar-ribbon-panel" id="toolbar-video-tools" role="tabpanel" hidden>
79
+ <button type="button" class="toolbar-ribbon-tool" id="tool-video-gen" title="拖到画布指定位置创建视频生成元素"><span>视频生成</span></button>
80
+ <button type="button" class="toolbar-ribbon-tool" id="tool-animation-gen" title="拖到画布指定位置创建序列帧动画生成管线"><span>序列帧动画生成</span></button>
81
+ </div>
82
+ </div>
54
83
  </div>
55
84
  </div>
56
85
  <div class="canvas-viewport" id="viewport">
@@ -65,25 +94,110 @@
65
94
  <div class="ctx-menu" id="ctx-menu" hidden>
66
95
  <button type="button" data-action="copy">复制</button>
67
96
  <button type="button" data-action="paste" hidden>粘贴</button>
68
- <button type="button" data-action="cutout" hidden>智能抠图</button>
97
+ <button type="button" data-action="export-tile-map" hidden>导出 PNG</button>
98
+ <button type="button" data-action="image-canvas-size" hidden>图片大小编辑</button>
69
99
  <button type="button" data-action="interactive-edit" hidden>交互编辑</button>
70
- <button type="button" data-action="layer-decomposition" hidden>大模型图层分离</button>
100
+ <button type="button" data-action="perfect-pixel" hidden>完美像素化</button>
101
+ <div class="ctx-submenu" data-submenu="cutout" hidden>
102
+ <button type="button" class="ctx-submenu-trigger" aria-haspopup="menu" aria-expanded="false">
103
+ <span>抠图</span><span class="ctx-submenu-arrow" aria-hidden="true">›</span>
104
+ </button>
105
+ <div class="ctx-submenu-panel" role="menu">
106
+ <button type="button" role="menuitem" data-action="cutout" hidden>智能抠图</button>
107
+ <button type="button" role="menuitem" data-action="color-key" hidden>颜色剔除</button>
108
+ </div>
109
+ </div>
71
110
  <button type="button" data-action="video-cycle" hidden>智能周期提取</button>
72
111
  <button type="button" data-action="video-to-frame-sheet" hidden>视频转序列帧图</button>
73
- <button type="button" data-action="smart-split">智能切分</button>
74
- <button type="button" data-action="manual-split">手动切分</button>
75
- <button type="button" data-action="frame-sheet-preview" hidden>序列帧预览</button>
76
- <button type="button" data-action="frame-sheet-edit" hidden>序列帧编辑</button>
112
+ <div class="ctx-submenu" data-submenu="image-split" hidden>
113
+ <button type="button" class="ctx-submenu-trigger" aria-haspopup="menu" aria-expanded="false">
114
+ <span>图片切分</span><span class="ctx-submenu-arrow" aria-hidden="true">›</span>
115
+ </button>
116
+ <div class="ctx-submenu-panel" role="menu">
117
+ <button type="button" role="menuitem" data-action="smart-split">智能切分</button>
118
+ <button type="button" role="menuitem" data-action="manual-split">手动切分</button>
119
+ <button type="button" role="menuitem" data-action="layer-decomposition" hidden>大模型图层分离</button>
120
+ </div>
121
+ </div>
122
+ <div class="ctx-submenu" data-submenu="frame-sheet" hidden>
123
+ <button type="button" class="ctx-submenu-trigger" aria-haspopup="menu" aria-expanded="false">
124
+ <span>序列帧</span><span class="ctx-submenu-arrow" aria-hidden="true">›</span>
125
+ </button>
126
+ <div class="ctx-submenu-panel" role="menu">
127
+ <button type="button" role="menuitem" data-action="frame-sheet-preview" hidden>序列帧预览</button>
128
+ <button type="button" role="menuitem" data-action="frame-sheet-edit" hidden>序列帧编辑</button>
129
+ </div>
130
+ </div>
131
+ <div class="ctx-submenu" data-submenu="character-views" hidden>
132
+ <button type="button" class="ctx-submenu-trigger" aria-haspopup="menu" aria-expanded="false">
133
+ <span>角色多视角生成</span><span class="ctx-submenu-arrow" aria-hidden="true">›</span>
134
+ </button>
135
+ <div class="ctx-submenu-panel" role="menu">
136
+ <button type="button" role="menuitem" data-action="four-view" hidden>四视图生成</button>
137
+ <button type="button" role="menuitem" data-action="eight-direction" hidden>八方图生成</button>
138
+ </div>
139
+ </div>
140
+ <div class="ctx-submenu" data-submenu="map-tiles" hidden>
141
+ <button type="button" class="ctx-submenu-trigger" aria-haspopup="menu" aria-expanded="false">
142
+ <span>地图瓦片</span><span class="ctx-submenu-arrow" aria-hidden="true">›</span>
143
+ </button>
144
+ <div class="ctx-submenu-panel" role="menu">
145
+ <button type="button" role="menuitem" data-action="seam-elimination" hidden>瓦片缝隙消除</button>
146
+ <button type="button" role="menuitem" data-action="tile-transition-atlas" hidden>地图集生成</button>
147
+ </div>
148
+ </div>
77
149
  <button type="button" data-action="delete" class="ctx-danger">删除</button>
78
150
  </div>
79
151
 
152
+ <div class="modal-backdrop modal-backdrop-dark" id="image-canvas-size-modal" hidden>
153
+ <div class="modal-dialog modal-dialog-image-canvas-size" role="group" aria-labelledby="image-canvas-size-title">
154
+ <div class="seq-panel-head">
155
+ <strong id="image-canvas-size-title">图片大小编辑</strong>
156
+ <button type="button" class="ghost-btn" id="image-canvas-size-close">关闭</button>
157
+ </div>
158
+ <div class="image-canvas-size-stage" id="image-canvas-size-stage">
159
+ <canvas id="image-canvas-size-preview"></canvas>
160
+ <div class="image-canvas-size-frame" id="image-canvas-size-frame">
161
+ <button type="button" class="image-canvas-size-edge is-top" data-edge="top" aria-label="拖动上边缘"></button>
162
+ <button type="button" class="image-canvas-size-edge is-right" data-edge="right" aria-label="拖动右边缘"></button>
163
+ <button type="button" class="image-canvas-size-edge is-bottom" data-edge="bottom" aria-label="拖动下边缘"></button>
164
+ <button type="button" class="image-canvas-size-edge is-left" data-edge="left" aria-label="拖动左边缘"></button>
165
+ </div>
166
+ </div>
167
+ <div class="image-canvas-size-fields">
168
+ <label class="seq-field">
169
+ 宽度
170
+ <input type="number" id="image-canvas-size-width" min="1" max="16384" step="1" />
171
+ <span>px</span>
172
+ </label>
173
+ <label class="seq-field">
174
+ 高度
175
+ <input type="number" id="image-canvas-size-height" min="1" max="16384" step="1" />
176
+ <span>px</span>
177
+ </label>
178
+ </div>
179
+ <div class="modal-actions">
180
+ <button type="button" class="ghost-btn" id="image-canvas-size-reset">重置</button>
181
+ <button type="button" class="ghost-btn" id="image-canvas-size-cancel">取消</button>
182
+ <button type="button" class="tool-btn" id="image-canvas-size-confirm">应用</button>
183
+ </div>
184
+ </div>
185
+ </div>
186
+
80
187
  <div class="modal-backdrop modal-backdrop-dark" id="interactive-edit-modal" hidden>
81
- <div class="modal-dialog modal-dialog-interactive-edit" role="dialog" aria-modal="true" aria-labelledby="interactive-edit-title">
188
+ <div class="modal-dialog modal-dialog-interactive-edit" role="group" aria-labelledby="interactive-edit-title">
82
189
  <div class="seq-panel-head">
83
190
  <strong id="interactive-edit-title">交互编辑</strong>
84
191
  <button type="button" class="ghost-btn" id="interactive-edit-close">关闭</button>
85
192
  </div>
86
- <div class="interactive-editor-host" id="interactive-editor-host"></div>
193
+ <div class="interactive-editor-stage">
194
+ <div class="interactive-editor-host" id="interactive-editor-host"></div>
195
+ <label class="interactive-edit-zoom" for="interactive-edit-zoom">
196
+ <span>缩放</span>
197
+ <input type="range" id="interactive-edit-zoom" min="1" max="400" step="1" value="100" />
198
+ <output id="interactive-edit-zoom-value" for="interactive-edit-zoom">100%</output>
199
+ </label>
200
+ </div>
87
201
  <div class="interactive-edit-compose">
88
202
  <label class="layer-decomposition-prompt" for="interactive-edit-prompt">
89
203
  编辑要求
@@ -93,7 +207,14 @@
93
207
  placeholder="例如:将框选区域替换为木质宝箱,并保持其他内容不变"
94
208
  ></textarea>
95
209
  </label>
96
- <p class="modal-hint">画面标记和文字会合并到参考图中,并使用 Pro 模型生成。</p>
210
+ <label class="interactive-edit-model" for="interactive-edit-model">
211
+ <span>模型</span>
212
+ <select id="interactive-edit-model">
213
+ <option value="asset-pro">Pro</option>
214
+ <option value="asset-max">Max</option>
215
+ </select>
216
+ </label>
217
+ <p class="modal-hint">画面标记和文字会合并到参考图中,再使用所选模型生成。</p>
97
218
  <p class="modal-hint" id="interactive-edit-status" hidden></p>
98
219
  <div class="modal-actions">
99
220
  <button type="button" class="ghost-btn" id="interactive-edit-cancel">取消</button>
@@ -104,8 +225,42 @@
104
225
  </div>
105
226
  </div>
106
227
 
228
+ <div class="modal-backdrop modal-backdrop-dark" id="seam-elimination-modal" hidden>
229
+ <div class="modal-dialog modal-dialog-seam-elimination" role="group" aria-labelledby="seam-elimination-title">
230
+ <div class="seq-panel-head">
231
+ <strong id="seam-elimination-title">缝隙消除</strong>
232
+ <button type="button" class="ghost-btn" id="seam-elimination-close">关闭</button>
233
+ </div>
234
+ <div class="seam-elimination-preview">
235
+ <img id="seam-elimination-image" alt="待处理地砖预览" />
236
+ </div>
237
+ <label class="layer-decomposition-prompt" for="seam-elimination-prompt">
238
+ 地砖描述
239
+ <textarea
240
+ id="seam-elimination-prompt"
241
+ rows="4"
242
+ placeholder="描述地砖的内容、材质和美术风格"
243
+ ></textarea>
244
+ </label>
245
+ <label class="interactive-edit-model" for="seam-elimination-model">
246
+ <span>模型</span>
247
+ <select id="seam-elimination-model"></select>
248
+ </label>
249
+ <div class="seam-elimination-size-row">
250
+ <span>输出尺寸</span>
251
+ <output id="seam-elimination-size">读取中…</output>
252
+ </div>
253
+ <p class="modal-hint">输出尺寸锁定为输入图片的像素尺寸。</p>
254
+ <p class="modal-hint" id="seam-elimination-status" hidden></p>
255
+ <div class="modal-actions">
256
+ <button type="button" class="ghost-btn" id="seam-elimination-cancel">取消</button>
257
+ <button type="button" class="tool-btn" id="seam-elimination-confirm">开始处理</button>
258
+ </div>
259
+ </div>
260
+ </div>
261
+
107
262
  <div class="modal-backdrop modal-backdrop-dark" id="layer-decomposition-modal" hidden>
108
- <div class="modal-dialog modal-dialog-layer-decomposition" role="dialog" aria-modal="true" aria-labelledby="layer-decomposition-title">
263
+ <div class="modal-dialog modal-dialog-layer-decomposition" role="group" aria-labelledby="layer-decomposition-title">
109
264
  <div class="seq-panel-head">
110
265
  <strong id="layer-decomposition-title">大模型图层分离</strong>
111
266
  <button type="button" class="ghost-btn" id="layer-decomposition-close">关闭</button>
@@ -131,7 +286,7 @@
131
286
  </div>
132
287
 
133
288
  <div class="modal-backdrop modal-backdrop-dark" id="video-cycle-modal" hidden>
134
- <div class="modal-dialog" role="dialog" aria-modal="true" aria-labelledby="video-cycle-title">
289
+ <div class="modal-dialog" role="group" aria-labelledby="video-cycle-title">
135
290
  <div class="seq-panel-head">
136
291
  <strong id="video-cycle-title">智能周期提取</strong>
137
292
  <button type="button" class="ghost-btn" id="video-cycle-close">关闭</button>
@@ -172,15 +327,23 @@
172
327
  </div>
173
328
 
174
329
  <div class="modal-backdrop modal-backdrop-dark" id="smart-split-modal" hidden>
175
- <div class="modal-dialog" role="dialog" aria-modal="true" aria-labelledby="smart-split-title">
330
+ <div class="modal-dialog" role="group" aria-labelledby="smart-split-title">
176
331
  <div class="seq-panel-head">
177
332
  <strong id="smart-split-title">智能切分</strong>
178
333
  <button type="button" class="ghost-btn" id="smart-split-close">关闭</button>
179
334
  </div>
180
335
  <p class="modal-hint">
181
- 切分结果统一为最大主体的宽度和高度。选择主体在扩展区域中的固定基准点;主体不会缩放。
336
+ 自动识别并裁出彼此分离的主体;主体不会缩放。
182
337
  </p>
183
- <div class="split-anchor-grid" id="smart-split-anchor-grid" role="radiogroup" aria-label="扩展基准点">
338
+ <label class="smart-split-size-toggle">
339
+ <input type="checkbox" id="smart-split-pad-to-same-size" checked />
340
+ <span>
341
+ <strong>补全为相同图片大小</strong>
342
+ <small>只在裁切结果周围填充透明像素,不扩大原图裁切范围。</small>
343
+ </span>
344
+ </label>
345
+ <p class="modal-hint">透明补全时主体的对齐位置:</p>
346
+ <div class="split-anchor-grid" id="smart-split-anchor-grid" role="radiogroup" aria-label="透明补全对齐位置">
184
347
  <button type="button" class="split-anchor-btn" data-anchor="top-left" role="radio" aria-checked="false"><span></span>左上</button>
185
348
  <button type="button" class="split-anchor-btn" data-anchor="top" role="radio" aria-checked="false"><span></span>上</button>
186
349
  <button type="button" class="split-anchor-btn" data-anchor="top-right" role="radio" aria-checked="false"><span></span>右上</button>
@@ -200,7 +363,7 @@
200
363
  </div>
201
364
 
202
365
  <div class="modal-backdrop modal-backdrop-dark" id="manual-split-modal" hidden>
203
- <div class="modal-dialog" role="dialog" aria-modal="true" aria-labelledby="manual-split-title">
366
+ <div class="modal-dialog" role="group" aria-labelledby="manual-split-title">
204
367
  <div class="seq-panel-head">
205
368
  <strong id="manual-split-title">手动切分</strong>
206
369
  <button type="button" class="ghost-btn" id="manual-split-close">关闭</button>
@@ -229,7 +392,7 @@
229
392
  </div>
230
393
 
231
394
  <div class="modal-backdrop modal-backdrop-dark" id="frame-extract-modal" hidden>
232
- <div class="modal-dialog" role="dialog" aria-modal="true" aria-labelledby="frame-extract-title">
395
+ <div class="modal-dialog" role="group" aria-labelledby="frame-extract-title">
233
396
  <div class="seq-panel-head">
234
397
  <strong id="frame-extract-title">视频转序列帧图</strong>
235
398
  <button type="button" class="ghost-btn" id="frame-extract-close">关闭</button>
@@ -238,9 +401,9 @@
238
401
  均匀抽取视频帧后,自动按从左到右、从上到下的顺序拼成一张 PNG 图片。
239
402
  </p>
240
403
  <label class="seq-field frame-extract-field">
241
- 抽取帧数
242
- <input type="number" id="frame-extract-count" min="2" max="30" step="1" value="10" />
243
- <span class="frame-extract-range">2 – 30</span>
404
+ FPS
405
+ <input type="number" id="frame-extract-fps" min="0.1" max="60" step="0.1" value="8" />
406
+ <span class="frame-extract-range">0.1 – 60</span>
244
407
  </label>
245
408
  <p class="modal-hint" id="frame-extract-status" hidden></p>
246
409
  <div class="modal-actions">
@@ -251,7 +414,7 @@
251
414
  </div>
252
415
 
253
416
  <div class="modal-backdrop modal-backdrop-dark" id="frame-preview-modal" hidden>
254
- <div class="modal-dialog" role="dialog" aria-modal="true" aria-labelledby="frame-preview-title">
417
+ <div class="modal-dialog" role="group" aria-labelledby="frame-preview-title">
255
418
  <div class="seq-panel-head">
256
419
  <strong id="frame-preview-title">序列帧预览</strong>
257
420
  <button type="button" class="ghost-btn" id="frame-preview-close">关闭</button>
@@ -284,7 +447,7 @@
284
447
  </div>
285
448
 
286
449
  <div class="modal-backdrop modal-backdrop-dark" id="frame-editor-split-modal" hidden>
287
- <div class="modal-dialog" role="dialog" aria-modal="true" aria-labelledby="frame-editor-split-title">
450
+ <div class="modal-dialog" role="group" aria-labelledby="frame-editor-split-title">
288
451
  <div class="seq-panel-head">
289
452
  <strong id="frame-editor-split-title">创建序列帧编辑器</strong>
290
453
  <button type="button" class="ghost-btn" id="frame-editor-split-close">关闭</button>