evomeme 0.1.9 → 0.1.10-beta.13

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 (477) hide show
  1. package/README.md +2 -0
  2. package/dist/canvas-public/app.js +509 -5999
  3. package/dist/canvas-public/assets/presets/catalog.json +47 -0
  4. package/dist/canvas-public/assets/presets/tiles/A_01_CaoDi.png +0 -0
  5. package/dist/canvas-public/assets/presets/tiles/A_02_ShaMo.png +0 -0
  6. package/dist/canvas-public/assets/presets/tiles/A_03_TianKong.png +0 -0
  7. package/dist/canvas-public/assets/presets/tiles/A_04_ShuiBo.png +0 -0
  8. package/dist/canvas-public/assets/presets/tiles/A_05_HaiMian.png +0 -0
  9. package/dist/canvas-public/assets/presets/tiles/A_06_MuDiBan.png +0 -0
  10. package/dist/canvas-public/assets/presets/tiles/A_07_ShiZhuan.png +0 -0
  11. package/dist/canvas-public/assets/presets/tiles/A_08_AnRongYan.png +0 -0
  12. package/dist/canvas-public/assets/presets/tiles/A_09_QingTaiShi.png +0 -0
  13. package/dist/canvas-public/assets/presets/tiles/A_10_ShenHai.png +0 -0
  14. package/dist/canvas-public/assets/presets/tiles/A_11_HuiYanShi.png +0 -0
  15. package/dist/canvas-public/assets/presets/tiles/A_12_HongTu.png +0 -0
  16. package/dist/canvas-public/assets/presets/tiles/A_13_GengDi.png +0 -0
  17. package/dist/canvas-public/assets/presets/tiles/A_14_HuoShanYan.png +0 -0
  18. package/dist/canvas-public/assets/presets/tiles/A_15_NiTu.png +0 -0
  19. package/dist/canvas-public/assets/presets/tiles/A_16_HuangSha.png +0 -0
  20. package/dist/canvas-public/assets/presets/tiles/A_17_CongLin.png +0 -0
  21. package/dist/canvas-public/assets/presets/tiles/A_18_ZiYanShi.png +0 -0
  22. package/dist/canvas-public/assets/presets/tiles/A_19_MoGuTu.png +0 -0
  23. package/dist/canvas-public/assets/presets/tiles/A_20_HuaDian.png +0 -0
  24. package/dist/canvas-public/assets/presets/tiles/A_21_HaiLang.png +0 -0
  25. package/dist/canvas-public/assets/presets/tiles/A_22_GanTu.png +0 -0
  26. package/dist/canvas-public/assets/presets/tiles/A_23_QingTaiShiBan.png +0 -0
  27. package/dist/canvas-public/assets/presets/tiles/A_24_XingKong.png +0 -0
  28. package/dist/canvas-public/assets/presets/tiles/A_25_MoFaFuWen.png +0 -0
  29. package/dist/canvas-public/assets/presets/tiles/A_26_ShiTuYeDi.png +0 -0
  30. package/dist/canvas-public/assets/presets/tiles/A_27_LanZhuan.png +0 -0
  31. package/dist/canvas-public/assets/presets/tiles/A_28_HongZhuan.png +0 -0
  32. package/dist/canvas-public/assets/presets/tiles/A_29_YueQiu.png +0 -0
  33. package/dist/canvas-public/assets/presets/tiles/A_30_JinShuGe.png +0 -0
  34. package/dist/canvas-public/assets/presets/tiles/A_31_JinShuJingGai.png +0 -0
  35. package/dist/canvas-public/assets/presets/tiles/A_32_ShuZiChuang.png +0 -0
  36. package/dist/canvas-public/canvas/actions.js +144 -0
  37. package/dist/canvas-public/canvas/camera.js +28 -0
  38. package/dist/canvas-public/canvas/chrome.js +14 -0
  39. package/dist/canvas-public/canvas/data.js +123 -0
  40. package/dist/canvas-public/canvas/dependencies.js +19 -0
  41. package/dist/canvas-public/canvas/interactions.js +544 -0
  42. package/dist/canvas-public/canvas/panel-resize.js +5 -0
  43. package/dist/canvas-public/canvas/renderer.js +297 -0
  44. package/dist/canvas-public/canvas/selection.js +62 -0
  45. package/dist/canvas-public/canvas/serialization.js +118 -0
  46. package/dist/canvas-public/canvas/sync.js +202 -0
  47. package/dist/canvas-public/core/api.js +32 -0
  48. package/dist/canvas-public/core/feature-registry.js +29 -0
  49. package/dist/canvas-public/core/feature-state.js +228 -0
  50. package/dist/canvas-public/core/layout.js +133 -0
  51. package/dist/canvas-public/core/operations.js +38 -0
  52. package/dist/canvas-public/core/project.js +203 -0
  53. package/dist/canvas-public/core/state.js +27 -0
  54. package/dist/canvas-public/dialogs/context-menu.js +118 -0
  55. package/dist/canvas-public/elements/base.js +100 -0
  56. package/dist/canvas-public/elements/connections.js +105 -0
  57. package/dist/canvas-public/elements/drag.js +53 -0
  58. package/dist/canvas-public/elements/image.js +259 -0
  59. package/dist/canvas-public/elements/loading-recovery.js +5 -0
  60. package/dist/canvas-public/elements/loading.js +21 -0
  61. package/dist/canvas-public/elements/map.js +64 -0
  62. package/dist/canvas-public/elements/registry.js +58 -0
  63. package/dist/canvas-public/elements/replacement.js +78 -0
  64. package/dist/canvas-public/elements/resize.js +210 -0
  65. package/dist/canvas-public/elements/task-pipeline.js +235 -0
  66. package/dist/canvas-public/elements/types.js +21 -0
  67. package/dist/canvas-public/elements/ui.js +14 -0
  68. package/dist/canvas-public/elements/video.js +64 -0
  69. package/dist/canvas-public/features/assets/local-assets.js +72 -0
  70. package/dist/canvas-public/features/assets/official-assets.js +539 -0
  71. package/dist/canvas-public/features/editing/canvas-size.js +532 -0
  72. package/dist/canvas-public/features/editing/color-key.js +471 -0
  73. package/dist/canvas-public/features/editing/cutout.js +20 -0
  74. package/dist/canvas-public/features/editing/interactive-image-editing.js +982 -0
  75. package/dist/canvas-public/features/editing/layer-decomposition.js +45 -0
  76. package/dist/canvas-public/features/editing/manual-split.js +115 -0
  77. package/dist/canvas-public/features/editing/perfect-pixel.js +299 -0
  78. package/dist/canvas-public/features/editing/scroll-preview.js +130 -0
  79. package/dist/canvas-public/features/editing/scroll-seam-elimination.js +71 -0
  80. package/dist/canvas-public/features/editing/seam-elimination.js +46 -0
  81. package/dist/canvas-public/features/editing/smart-split.js +49 -0
  82. package/dist/canvas-public/features/editing/source-preview.js +43 -0
  83. package/dist/canvas-public/features/editing/video-cycle.js +49 -0
  84. package/dist/canvas-public/features/editing/video-frames.js +35 -0
  85. package/dist/canvas-public/features/frame-editor/frame-editing.js +755 -0
  86. package/dist/canvas-public/features/frame-editor/frame-model.js +63 -0
  87. package/dist/canvas-public/features/frame-editor/playback.js +83 -0
  88. package/dist/canvas-public/features/frame-editor/preview.js +151 -0
  89. package/dist/canvas-public/features/generation/animation.js +272 -0
  90. package/dist/canvas-public/features/generation/asset-batch.js +102 -0
  91. package/dist/canvas-public/features/generation/direction.js +163 -0
  92. package/dist/canvas-public/features/generation/fields.js +73 -0
  93. package/dist/canvas-public/features/generation/game-ui.js +64 -0
  94. package/dist/canvas-public/features/generation/image.js +96 -0
  95. package/dist/canvas-public/features/generation/scroll-image.js +157 -0
  96. package/dist/canvas-public/features/generation/seamless-tile.js +52 -0
  97. package/dist/canvas-public/features/generation/tile-transition-atlas.js +79 -0
  98. package/dist/canvas-public/features/generation/video.js +105 -0
  99. package/dist/canvas-public/features/map/creation.js +73 -0
  100. package/dist/canvas-public/features/map/tile-map-editor.js +2520 -0
  101. package/dist/canvas-public/features/registry.js +59 -0
  102. package/dist/canvas-public/index.html +84 -259
  103. package/dist/canvas-public/inspector/controls.js +49 -0
  104. package/dist/canvas-public/inspector/frame-preview.js +11 -0
  105. package/dist/canvas-public/inspector/inspector.js +190 -0
  106. package/dist/canvas-public/inspector/media-inspector.js +517 -0
  107. package/dist/canvas-public/inspector/media-preview.js +56 -0
  108. package/dist/canvas-public/inspector/number-stepper.js +96 -0
  109. package/dist/canvas-public/inspector/resize.js +88 -0
  110. package/dist/canvas-public/inspector/scroll-preview.js +11 -0
  111. package/dist/canvas-public/inspector/ui-inspector.js +14 -0
  112. package/dist/canvas-public/language/en-US.js +1059 -0
  113. package/dist/canvas-public/language/index.js +91 -0
  114. package/dist/canvas-public/language/zh-CN.js +1059 -0
  115. package/dist/canvas-public/map/export.js +10 -0
  116. package/dist/canvas-public/map/inspector.js +8 -0
  117. package/dist/canvas-public/map/model.js +409 -0
  118. package/dist/canvas-public/map/tile-map-editor.js +2 -0
  119. package/dist/canvas-public/media/metadata.js +183 -0
  120. package/dist/canvas-public/media/support.js +183 -0
  121. package/dist/canvas-public/styles/base.css +49 -0
  122. package/dist/canvas-public/styles/canvas.css +127 -0
  123. package/dist/canvas-public/styles/controls.css +203 -0
  124. package/dist/canvas-public/styles/dialogs.css +521 -0
  125. package/dist/canvas-public/styles/feature-form.css +409 -0
  126. package/dist/canvas-public/styles/inspector.css +441 -0
  127. package/dist/canvas-public/styles/layout.css +344 -0
  128. package/dist/canvas-public/styles/map.css +11 -0
  129. package/dist/canvas-public/styles/nodes.css +636 -0
  130. package/dist/canvas-public/styles.css +9 -2247
  131. package/dist/canvas-public/ui/controls.js +222 -0
  132. package/dist/canvas-public/ui/elements.js +9 -0
  133. package/dist/canvas-public/ui/feature-controller.js +296 -0
  134. package/dist/canvas-public/ui/feature-form.js +402 -0
  135. package/dist/canvas-public/ui/settings.js +84 -0
  136. package/dist/canvas-public/ui/toolbar.js +55 -0
  137. package/dist/canvas-public/vendor/pixi-tilemap.js +126 -0
  138. package/dist/canvas-public/vendor/pixi.min.js +2340 -0
  139. package/dist/canvas-public/workers/color-key-worker.js +289 -0
  140. package/dist/image-workers/perfect-pixel/perfect-pixel-core.js +441 -0
  141. package/dist/image-workers/perfect-pixel/perfect-pixel-worker.cjs +10 -0
  142. package/dist/index.js +46710 -12400
  143. package/dist/skills/en-US/evomeme-canvas/SKILL.md +52 -0
  144. package/dist/skills/en-US/evomeme-canvas/agents/openai.yaml +7 -0
  145. package/dist/skills/en-US/evomeme-cloud-fs/SKILL.md +203 -0
  146. package/dist/skills/en-US/evomeme-cloud-fs/agents/openai.yaml +7 -0
  147. package/dist/skills/en-US/evomeme-cover/SKILL.md +131 -0
  148. package/dist/skills/en-US/evomeme-cover/agents/openai.yaml +7 -0
  149. package/dist/skills/en-US/evomeme-game-maker/SKILL.md +288 -0
  150. package/dist/skills/en-US/evomeme-game-maker/agents/openai.yaml +4 -0
  151. package/dist/skills/en-US/evomeme-login/SKILL.md +97 -0
  152. package/dist/skills/en-US/evomeme-login/agents/openai.yaml +7 -0
  153. package/dist/skills/en-US/evomeme-mcp/SKILL.md +71 -0
  154. package/dist/skills/en-US/evomeme-mcp/agents/openai.yaml +7 -0
  155. package/dist/skills/en-US/evomeme-mcp/references/troubleshooting.md +55 -0
  156. package/dist/skills/en-US/evomeme-native-bridge-sdk/SKILL.md +286 -0
  157. package/dist/skills/en-US/evomeme-native-bridge-sdk/agents/openai.yaml +8 -0
  158. package/dist/skills/en-US/evomeme-tos-upload/SKILL.md +47 -0
  159. package/dist/skills/en-US/evomeme-tos-upload/agents/openai.yaml +5 -0
  160. package/dist/skills/en-US/evomeme-ui/SKILL.md +123 -0
  161. package/dist/skills/en-US/evomeme-ui/agents/openai.yaml +4 -0
  162. package/dist/skills/en-US/evomeme-ui/references/host-layout.md +69 -0
  163. package/dist/skills/en-US/game-art/SKILL.md +121 -0
  164. package/dist/skills/en-US/game-art/agents/openai.yaml +8 -0
  165. package/dist/skills/en-US/game-asset-align/SKILL.md +47 -0
  166. package/dist/skills/en-US/game-asset-align/agents/openai.yaml +8 -0
  167. package/dist/skills/en-US/game-asset-align/references/alignment-contract.md +61 -0
  168. package/dist/skills/en-US/game-asset-align/references/blender-scene-pipeline.md +35 -0
  169. package/dist/skills/en-US/game-asset-align/references/canonical-package.md +26 -0
  170. package/dist/skills/en-US/game-asset-align/references/engine-capabilities.md +14 -0
  171. package/dist/skills/en-US/game-asset-align/references/lightweight-review.md +34 -0
  172. package/dist/skills/en-US/game-asset-align/references/repair-policy.md +30 -0
  173. package/dist/skills/en-US/game-asset-align/references/tool-contract.md +69 -0
  174. package/dist/skills/en-US/game-asset-align/references/visual-review.md +26 -0
  175. package/dist/skills/en-US/game-asset-batch-generator/SKILL.md +117 -0
  176. package/dist/skills/en-US/game-asset-batch-generator/agents/openai.yaml +7 -0
  177. package/dist/skills/en-US/game-asset-image-generator/SKILL.md +86 -0
  178. package/dist/skills/en-US/game-asset-image-generator/agents/openai.yaml +7 -0
  179. package/dist/skills/en-US/game-asset-image-generator/references/background.md +34 -0
  180. package/dist/skills/en-US/game-asset-image-generator/references/static-game-assets.md +38 -0
  181. package/dist/skills/en-US/game-asset-mesh-generator/SKILL.md +35 -0
  182. package/dist/skills/en-US/game-asset-mesh-generator/agents/openai.yaml +7 -0
  183. package/dist/skills/en-US/game-asset-mesh-generator/references/animation-presets.md +313 -0
  184. package/dist/skills/en-US/game-asset-mesh-generator/references/generation-contracts.md +131 -0
  185. package/dist/skills/en-US/game-asset-mesh-generator/references/image-generator-workflows.md +65 -0
  186. package/dist/skills/en-US/game-asset-mesh-generator/references/postprocess-contracts.md +187 -0
  187. package/dist/skills/en-US/game-asset-mesh-generator/references/threejs-integration.md +113 -0
  188. package/dist/skills/en-US/game-asset-mesh-generator/references/tool-reference.md +67 -0
  189. package/dist/skills/en-US/game-audio/SKILL.md +121 -0
  190. package/dist/skills/en-US/game-audio/agents/openai.yaml +4 -0
  191. package/{skills → dist/skills/en-US}/game-audio/references/bgm-cdn.md +7 -11
  192. package/{skills → dist/skills/en-US}/game-audio/references/sfx-cdn.md +6 -4
  193. package/dist/skills/en-US/game-character-view-generator/SKILL.md +110 -0
  194. package/dist/skills/en-US/game-character-view-generator/agents/openai.yaml +7 -0
  195. package/dist/skills/en-US/game-demo/SKILL.md +103 -0
  196. package/dist/skills/en-US/game-demo/agents/openai.yaml +7 -0
  197. package/dist/skills/en-US/game-image-layer-decomposer/SKILL.md +99 -0
  198. package/dist/skills/en-US/game-image-layer-decomposer/agents/openai.yaml +7 -0
  199. package/dist/skills/en-US/game-image-splitter/SKILL.md +114 -0
  200. package/dist/skills/en-US/game-image-splitter/agents/openai.yaml +7 -0
  201. package/dist/skills/en-US/game-maker/SKILL.md +111 -0
  202. package/dist/skills/en-US/game-maker/agents/openai.yaml +4 -0
  203. package/dist/skills/en-US/game-perfect-pixel/SKILL.md +123 -0
  204. package/dist/skills/en-US/game-perfect-pixel/agents/openai.yaml +7 -0
  205. package/dist/skills/en-US/game-scroll-generator/SKILL.md +110 -0
  206. package/dist/skills/en-US/game-scroll-generator/agents/openai.yaml +7 -0
  207. package/dist/skills/en-US/game-test/SKILL.md +58 -0
  208. package/dist/skills/en-US/game-test/agents/openai.yaml +7 -0
  209. package/dist/skills/en-US/game-tile-generator/SKILL.md +152 -0
  210. package/dist/skills/en-US/game-tile-generator/agents/openai.yaml +7 -0
  211. package/dist/skills/en-US/game-ui/SKILL.md +177 -0
  212. package/dist/skills/en-US/game-ui/agents/openai.yaml +4 -0
  213. package/dist/skills/en-US/game-ui-generator/SKILL.md +82 -0
  214. package/dist/skills/en-US/game-ui-generator/agents/openai.yaml +7 -0
  215. package/dist/skills/en-US/game-ui-generator/references/component-patterns.md +65 -0
  216. package/dist/skills/en-US/game-ui-generator/references/runtime-integration.md +45 -0
  217. package/dist/skills/en-US/game-video-cycle/SKILL.md +98 -0
  218. package/dist/skills/en-US/game-video-cycle/agents/openai.yaml +7 -0
  219. package/dist/skills/en-US/game-video-generator/SKILL.md +78 -0
  220. package/dist/skills/en-US/game-video-generator/agents/openai.yaml +7 -0
  221. package/dist/skills/en-US/godot-3d-game/SKILL.md +41 -0
  222. package/dist/skills/en-US/godot-3d-game/agents/openai.yaml +8 -0
  223. package/dist/skills/en-US/godot-3d-game/references/alignment-gates.md +26 -0
  224. package/dist/skills/en-US/godot-3d-game/references/appearance-alignment.md +54 -0
  225. package/dist/skills/en-US/godot-3d-game/references/build-and-qa.md +22 -0
  226. package/dist/skills/en-US/godot-3d-game/references/canonical-asset-runtime.md +27 -0
  227. package/dist/skills/en-US/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
  228. package/dist/skills/en-US/godot-3d-game/references/physics-colliders.md +13 -0
  229. package/dist/skills/en-US/godot-3d-game/references/project-structure.md +22 -0
  230. package/dist/skills/en-US/godot-3d-game/references/skeleton-animation.md +16 -0
  231. package/dist/skills/en-US/phaser-2d-game/SKILL.md +127 -0
  232. package/dist/skills/en-US/phaser-2d-game/agents/openai.yaml +8 -0
  233. package/dist/skills/en-US/phaser-2d-game/references/engine-performance.md +64 -0
  234. package/dist/skills/en-US/phaser-2d-game/references/engine-physics.md +139 -0
  235. package/dist/skills/en-US/phaser-2d-game/references/engine-runtime.md +129 -0
  236. package/dist/skills/en-US/phaser-2d-game/references/engine-spritesheets.md +99 -0
  237. package/dist/skills/en-US/phaser-2d-game/references/engine-tilemaps.md +80 -0
  238. package/dist/skills/en-US/phaser-2d-game/references/file-structure.md +94 -0
  239. package/dist/skills/en-US/phaser-2d-graphics-builder/SKILL.md +68 -0
  240. package/dist/skills/en-US/phaser-2d-graphics-builder/agents/openai.yaml +7 -0
  241. package/dist/skills/en-US/threejs-3d-game/SKILL.md +117 -0
  242. package/dist/skills/en-US/threejs-3d-game/agents/openai.yaml +7 -0
  243. package/dist/skills/en-US/threejs-3d-game/references/engine-asset-pipeline.md +155 -0
  244. package/dist/skills/en-US/threejs-3d-game/references/engine-audio.md +70 -0
  245. package/dist/skills/en-US/threejs-3d-game/references/engine-input-camera.md +84 -0
  246. package/dist/skills/en-US/threejs-3d-game/references/engine-performance.md +96 -0
  247. package/dist/skills/en-US/threejs-3d-game/references/engine-physics.md +142 -0
  248. package/dist/skills/en-US/threejs-3d-game/references/engine-runtime.md +199 -0
  249. package/dist/skills/en-US/threejs-3d-game/references/file-structure.md +353 -0
  250. package/dist/skills/en-US/threejs-aaa-graphics-builder/SKILL.md +62 -0
  251. package/dist/skills/en-US/threejs-aaa-graphics-builder/agents/openai.yaml +7 -0
  252. package/{skills → dist/skills/zh-CN}/evomeme-cloud-fs/SKILL.md +33 -6
  253. package/{skills → dist/skills/zh-CN}/evomeme-cover/SKILL.md +7 -8
  254. package/{skills → dist/skills/zh-CN}/evomeme-game-maker/SKILL.md +91 -88
  255. package/{skills → dist/skills/zh-CN}/evomeme-login/SKILL.md +5 -0
  256. package/dist/skills/zh-CN/evomeme-mcp/SKILL.md +71 -0
  257. package/dist/skills/zh-CN/evomeme-mcp/agents/openai.yaml +7 -0
  258. package/dist/skills/zh-CN/evomeme-mcp/references/troubleshooting.md +55 -0
  259. package/{skills → dist/skills/zh-CN}/evomeme-tos-upload/SKILL.md +6 -5
  260. package/dist/skills/zh-CN/evomeme-ui/SKILL.md +123 -0
  261. package/dist/skills/zh-CN/evomeme-ui/agents/openai.yaml +4 -0
  262. package/dist/skills/zh-CN/evomeme-ui/references/host-layout.md +69 -0
  263. package/dist/skills/zh-CN/game-asset-align/SKILL.md +47 -0
  264. package/dist/skills/zh-CN/game-asset-align/agents/openai.yaml +8 -0
  265. package/dist/skills/zh-CN/game-asset-align/references/alignment-contract.md +61 -0
  266. package/dist/skills/zh-CN/game-asset-align/references/blender-scene-pipeline.md +35 -0
  267. package/dist/skills/zh-CN/game-asset-align/references/canonical-package.md +26 -0
  268. package/dist/skills/zh-CN/game-asset-align/references/engine-capabilities.md +14 -0
  269. package/dist/skills/zh-CN/game-asset-align/references/lightweight-review.md +34 -0
  270. package/dist/skills/zh-CN/game-asset-align/references/repair-policy.md +30 -0
  271. package/dist/skills/zh-CN/game-asset-align/references/tool-contract.md +69 -0
  272. package/dist/skills/zh-CN/game-asset-align/references/visual-review.md +26 -0
  273. package/dist/skills/zh-CN/game-asset-batch-generator/SKILL.md +117 -0
  274. package/dist/skills/zh-CN/game-asset-batch-generator/agents/openai.yaml +7 -0
  275. package/dist/skills/zh-CN/game-asset-image-generator/SKILL.md +86 -0
  276. package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/background.md +3 -1
  277. package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/static-game-assets.md +2 -2
  278. package/dist/skills/zh-CN/game-asset-mesh-generator/SKILL.md +35 -0
  279. package/dist/skills/zh-CN/game-asset-mesh-generator/agents/openai.yaml +7 -0
  280. package/dist/skills/zh-CN/game-asset-mesh-generator/references/animation-presets.md +313 -0
  281. package/dist/skills/zh-CN/game-asset-mesh-generator/references/generation-contracts.md +131 -0
  282. package/dist/skills/zh-CN/game-asset-mesh-generator/references/image-generator-workflows.md +65 -0
  283. package/dist/skills/zh-CN/game-asset-mesh-generator/references/postprocess-contracts.md +187 -0
  284. package/dist/skills/zh-CN/game-asset-mesh-generator/references/threejs-integration.md +113 -0
  285. package/dist/skills/zh-CN/game-asset-mesh-generator/references/tool-reference.md +67 -0
  286. package/dist/skills/zh-CN/game-audio/SKILL.md +121 -0
  287. package/dist/skills/zh-CN/game-audio/agents/openai.yaml +4 -0
  288. package/dist/skills/zh-CN/game-audio/references/bgm-cdn.md +123 -0
  289. package/dist/skills/zh-CN/game-audio/references/sfx-cdn.md +79 -0
  290. package/dist/skills/zh-CN/game-character-view-generator/SKILL.md +110 -0
  291. package/dist/skills/zh-CN/game-character-view-generator/agents/openai.yaml +7 -0
  292. package/dist/skills/zh-CN/game-image-layer-decomposer/SKILL.md +99 -0
  293. package/dist/skills/zh-CN/game-image-layer-decomposer/agents/openai.yaml +7 -0
  294. package/dist/skills/zh-CN/game-image-splitter/SKILL.md +114 -0
  295. package/dist/skills/zh-CN/game-image-splitter/agents/openai.yaml +7 -0
  296. package/dist/skills/zh-CN/game-perfect-pixel/SKILL.md +123 -0
  297. package/dist/skills/zh-CN/game-perfect-pixel/agents/openai.yaml +7 -0
  298. package/dist/skills/zh-CN/game-scroll-generator/SKILL.md +110 -0
  299. package/dist/skills/zh-CN/game-scroll-generator/agents/openai.yaml +7 -0
  300. package/dist/skills/zh-CN/game-test/references/checklists/playtest-qa.md +12 -0
  301. package/dist/skills/zh-CN/game-tile-generator/SKILL.md +151 -0
  302. package/dist/skills/zh-CN/game-tile-generator/agents/openai.yaml +7 -0
  303. package/{skills → dist/skills/zh-CN}/game-ui/SKILL.md +9 -1
  304. package/dist/skills/zh-CN/game-ui/references/checklists/game-ui-quality.md +14 -0
  305. package/dist/skills/zh-CN/game-ui/references/checklists/hud-readability.md +12 -0
  306. package/dist/skills/zh-CN/game-ui/references/checklists/mobile-input.md +12 -0
  307. package/dist/skills/zh-CN/game-ui/references/checklists/responsive-ui-fit.md +12 -0
  308. package/dist/skills/zh-CN/game-ui/references/ui-patterns.md +140 -0
  309. package/dist/skills/zh-CN/game-ui/references/ui-prompt-templates.md +63 -0
  310. package/dist/skills/zh-CN/game-ui-generator/SKILL.md +82 -0
  311. package/dist/skills/zh-CN/game-ui-generator/agents/openai.yaml +7 -0
  312. package/dist/skills/zh-CN/game-ui-generator/references/component-patterns.md +65 -0
  313. package/dist/skills/zh-CN/game-ui-generator/references/runtime-integration.md +45 -0
  314. package/dist/skills/zh-CN/game-video-cycle/SKILL.md +98 -0
  315. package/dist/skills/zh-CN/game-video-cycle/agents/openai.yaml +7 -0
  316. package/dist/skills/zh-CN/game-video-generator/SKILL.md +78 -0
  317. package/dist/skills/zh-CN/game-video-generator/agents/openai.yaml +7 -0
  318. package/dist/skills/zh-CN/godot-3d-game/SKILL.md +41 -0
  319. package/dist/skills/zh-CN/godot-3d-game/agents/openai.yaml +8 -0
  320. package/dist/skills/zh-CN/godot-3d-game/references/alignment-gates.md +26 -0
  321. package/dist/skills/zh-CN/godot-3d-game/references/appearance-alignment.md +54 -0
  322. package/dist/skills/zh-CN/godot-3d-game/references/build-and-qa.md +22 -0
  323. package/dist/skills/zh-CN/godot-3d-game/references/canonical-asset-runtime.md +27 -0
  324. package/dist/skills/zh-CN/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
  325. package/dist/skills/zh-CN/godot-3d-game/references/physics-colliders.md +13 -0
  326. package/dist/skills/zh-CN/godot-3d-game/references/project-structure.md +22 -0
  327. package/dist/skills/zh-CN/godot-3d-game/references/skeleton-animation.md +16 -0
  328. package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
  329. package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
  330. package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  331. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/compose-quality.md +10 -0
  332. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +9 -0
  333. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +15 -0
  334. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +10 -0
  335. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +9 -0
  336. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +9 -0
  337. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/compose-recipes.md +71 -0
  338. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +33 -0
  339. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/implementation-blueprint.md +82 -0
  340. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/sprite-recipes.md +90 -0
  341. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/technical-art.md +67 -0
  342. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/vfx-recipes.md +67 -0
  343. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/visual-scorecard.md +129 -0
  344. package/{skills → dist/skills/zh-CN}/threejs-3d-game/SKILL.md +6 -2
  345. package/dist/skills/zh-CN/threejs-3d-game/references/engine-asset-pipeline.md +155 -0
  346. package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/SKILL.md +6 -6
  347. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
  348. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
  349. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  350. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +23 -0
  351. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +19 -0
  352. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +14 -0
  353. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +14 -0
  354. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +15 -0
  355. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +17 -0
  356. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +236 -0
  357. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/implementation-blueprint.md +161 -0
  358. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/model-recipes.md +146 -0
  359. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/render-recipes.md +90 -0
  360. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/shader-cookbook.md +292 -0
  361. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/technical-art.md +167 -0
  362. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/visual-scorecard.md +147 -0
  363. package/dist/stage-blender/bake_materials.py +102 -0
  364. package/dist/stage-blender/export_scene.py +275 -0
  365. package/dist/stage-blender/preview_camera.py +90 -0
  366. package/dist/stage-blender/repair_mesh.py +112 -0
  367. package/dist/stage-public/app.js +759 -0
  368. package/dist/stage-public/baked/bakePilot.js +44 -0
  369. package/dist/stage-public/baked/bakedScene.js +129 -0
  370. package/dist/stage-public/baked/sceneAppearance.js +225 -0
  371. package/dist/stage-public/baked/sceneCamera.js +45 -0
  372. package/dist/stage-public/comparison-contract.js +28 -0
  373. package/dist/stage-public/delivery.html +4 -0
  374. package/dist/stage-public/delivery.js +17 -0
  375. package/dist/stage-public/godot/appearance.gd +170 -0
  376. package/dist/stage-public/godot/preview.gd +79 -0
  377. package/dist/stage-public/index.html +141 -0
  378. package/dist/stage-public/review-app.js +289 -0
  379. package/dist/stage-public/review-runtime.js +63 -0
  380. package/dist/stage-public/review.css +24 -0
  381. package/dist/stage-public/review.html +47 -0
  382. package/dist/stage-public/scene-runtime.js +212 -0
  383. package/dist/stage-public/sceneContractRuntime.js +235 -0
  384. package/dist/stage-public/styles.css +328 -0
  385. package/dist/stage-public/three-appearance.js +104 -0
  386. package/dist/stage-public/vendor/three170/LICENSE +21 -0
  387. package/dist/stage-public/vendor/three170/build/three.module.js +54571 -0
  388. package/dist/stage-public/vendor/three170/examples/jsm/controls/OrbitControls.js +1523 -0
  389. package/dist/stage-public/vendor/three170/examples/jsm/environments/RoomEnvironment.js +144 -0
  390. package/dist/stage-public/vendor/three170/examples/jsm/libs/fflate.module.js +2672 -0
  391. package/dist/stage-public/vendor/three170/examples/jsm/loaders/EXRLoader.js +2563 -0
  392. package/dist/stage-public/vendor/three170/examples/jsm/loaders/GLTFLoader.js +4727 -0
  393. package/dist/stage-public/vendor/three170/examples/jsm/utils/BufferGeometryUtils.js +1373 -0
  394. package/dist/tile-transition-mask.svg +40 -0
  395. package/package.json +24 -8
  396. package/dist/canvas-public/cycle-detect.js +0 -166
  397. package/dist/canvas-public/smart-split.js +0 -185
  398. package/skills/game-asset-image-generator/SKILL.md +0 -104
  399. package/skills/game-audio/SKILL.md +0 -82
  400. package/skills/game-audio/agents/openai.yaml +0 -4
  401. package/skills/threejs-3d-game/references/engine-asset-pipeline.md +0 -116
  402. /package/{skills → dist/skills/en-US}/game-test/references/checklists/playtest-qa.md +0 -0
  403. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/game-ui-quality.md +0 -0
  404. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/hud-readability.md +0 -0
  405. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/mobile-input.md +0 -0
  406. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/responsive-ui-fit.md +0 -0
  407. /package/{skills → dist/skills/en-US}/game-ui/references/ui-patterns.md +0 -0
  408. /package/{skills → dist/skills/en-US}/game-ui/references/ui-prompt-templates.md +0 -0
  409. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
  410. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
  411. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  412. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/compose-quality.md +0 -0
  413. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +0 -0
  414. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +0 -0
  415. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +0 -0
  416. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +0 -0
  417. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +0 -0
  418. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/compose-recipes.md +0 -0
  419. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +0 -0
  420. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/implementation-blueprint.md +0 -0
  421. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/sprite-recipes.md +0 -0
  422. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/technical-art.md +0 -0
  423. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/vfx-recipes.md +0 -0
  424. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/visual-scorecard.md +0 -0
  425. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
  426. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
  427. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  428. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +0 -0
  429. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +0 -0
  430. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +0 -0
  431. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +0 -0
  432. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +0 -0
  433. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +0 -0
  434. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +0 -0
  435. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/implementation-blueprint.md +0 -0
  436. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/model-recipes.md +0 -0
  437. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/render-recipes.md +0 -0
  438. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/shader-cookbook.md +0 -0
  439. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/technical-art.md +0 -0
  440. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/visual-scorecard.md +0 -0
  441. /package/{skills → dist/skills/zh-CN}/evomeme-canvas/SKILL.md +0 -0
  442. /package/{skills → dist/skills/zh-CN}/evomeme-canvas/agents/openai.yaml +0 -0
  443. /package/{skills → dist/skills/zh-CN}/evomeme-cloud-fs/agents/openai.yaml +0 -0
  444. /package/{skills → dist/skills/zh-CN}/evomeme-cover/agents/openai.yaml +0 -0
  445. /package/{skills → dist/skills/zh-CN}/evomeme-game-maker/agents/openai.yaml +0 -0
  446. /package/{skills → dist/skills/zh-CN}/evomeme-login/agents/openai.yaml +0 -0
  447. /package/{skills → dist/skills/zh-CN}/evomeme-native-bridge-sdk/SKILL.md +0 -0
  448. /package/{skills → dist/skills/zh-CN}/evomeme-native-bridge-sdk/agents/openai.yaml +0 -0
  449. /package/{skills → dist/skills/zh-CN}/evomeme-tos-upload/agents/openai.yaml +0 -0
  450. /package/{skills → dist/skills/zh-CN}/game-art/SKILL.md +0 -0
  451. /package/{skills → dist/skills/zh-CN}/game-art/agents/openai.yaml +0 -0
  452. /package/{skills → dist/skills/zh-CN}/game-asset-image-generator/agents/openai.yaml +0 -0
  453. /package/{skills → dist/skills/zh-CN}/game-demo/SKILL.md +0 -0
  454. /package/{skills → dist/skills/zh-CN}/game-demo/agents/openai.yaml +0 -0
  455. /package/{skills → dist/skills/zh-CN}/game-maker/SKILL.md +0 -0
  456. /package/{skills → dist/skills/zh-CN}/game-maker/agents/openai.yaml +0 -0
  457. /package/{skills → dist/skills/zh-CN}/game-test/SKILL.md +0 -0
  458. /package/{skills → dist/skills/zh-CN}/game-test/agents/openai.yaml +0 -0
  459. /package/{skills → dist/skills/zh-CN}/game-ui/agents/openai.yaml +0 -0
  460. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/SKILL.md +0 -0
  461. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/agents/openai.yaml +0 -0
  462. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-performance.md +0 -0
  463. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-physics.md +0 -0
  464. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-runtime.md +0 -0
  465. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-spritesheets.md +0 -0
  466. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-tilemaps.md +0 -0
  467. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/file-structure.md +0 -0
  468. /package/{skills → dist/skills/zh-CN}/phaser-2d-graphics-builder/SKILL.md +0 -0
  469. /package/{skills → dist/skills/zh-CN}/phaser-2d-graphics-builder/agents/openai.yaml +0 -0
  470. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/agents/openai.yaml +0 -0
  471. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-audio.md +0 -0
  472. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-input-camera.md +0 -0
  473. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-performance.md +0 -0
  474. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-physics.md +0 -0
  475. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-runtime.md +0 -0
  476. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/file-structure.md +0 -0
  477. /package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/agents/openai.yaml +0 -0
@@ -0,0 +1,517 @@
1
+ import { t } from '../language/index.js'
2
+ import { state } from '../core/state.js'
3
+ import { normalizeFramePreviewConfig, normalizeScrollPreviewConfig } from '../elements/image.js'
4
+ import { appendKv, createInspectorBlock, el } from './controls.js'
5
+
6
+ export function createMediaInspector(context) {
7
+ const {
8
+ createFramePreviewParameterModule,
9
+ createScrollPreviewParameterModule,
10
+ formatGenRefList,
11
+ formatGenTime,
12
+ formatOriginTime,
13
+ formatPerfectPixelSourceArea,
14
+ imageName,
15
+ imageSourceLabel,
16
+ imageUrl,
17
+ normalizeGenMeta,
18
+ originParentLabel,
19
+ renderInspector,
20
+ resolveItemOrigin,
21
+ } = context
22
+
23
+ function resolveTosUrl(item) {
24
+ const value =
25
+ item?.provenance?.assetUrl ||
26
+ item?.assetUrl ||
27
+ item?.asset_url ||
28
+ item?.tosUrl ||
29
+ item?.tos_url
30
+ return typeof value === 'string' && /^https?:\/\//i.test(value) ? value : ''
31
+ }
32
+
33
+ function tosLink(item) {
34
+ const url = resolveTosUrl(item)
35
+ if (!url) return null
36
+ const link = el('a', 'insp-tos-link', url)
37
+ link.href = url
38
+ link.target = '_blank'
39
+ link.rel = 'noopener noreferrer'
40
+ return link
41
+ }
42
+
43
+ function appendOriginSection(section, item) {
44
+ if (!item) return
45
+ section.appendChild(el('div', 'insp-label', t("inspector.mediaInspector.text001")))
46
+
47
+ const provenance = item.provenance
48
+ if (provenance && typeof provenance === 'object') {
49
+ const metadata = provenance.metadata
50
+ const sourceLabel =
51
+ ({
52
+ smart_split: t("inspector.mediaInspector.text002"),
53
+ manual_split: t("inspector.mediaInspector.text003"),
54
+ }[provenance.operation] ||
55
+ {
56
+ existing: t("inspector.mediaInspector.text004"),
57
+ generated: t("inspector.mediaInspector.text005"),
58
+ edited: t("inspector.mediaInspector.text006"),
59
+ copied: t("inspector.mediaInspector.text007"),
60
+ uploaded: t("inspector.mediaInspector.text008"),
61
+ }[provenance.source] || provenance.source || t("inspector.mediaInspector.text009"))
62
+ appendKv(section, [
63
+ [t("inspector.mediaInspector.text010"), sourceLabel],
64
+ [t("inspector.mediaInspector.text011"), provenance.assetId || item.id],
65
+ ...(provenance.jobId ? [[t("inspector.mediaInspector.text012"), provenance.jobId]] : []),
66
+ ...(provenance.imageModel ? [[t("inspector.mediaInspector.text013"), provenance.imageModel]] : []),
67
+ ...(provenance.size ? [[t("inspector.mediaInspector.text014"), provenance.size]] : []),
68
+ ...(provenance.operation === 'perfect_pixel' && metadata && typeof metadata === 'object'
69
+ ? [
70
+ [t("inspector.mediaInspector.text015"), metadata.autoGrid === true ? t("inspector.mediaInspector.text016") : t("inspector.mediaInspector.text017")],
71
+ [
72
+ t("inspector.mediaInspector.text018"),
73
+ formatPerfectPixelSourceArea(
74
+ metadata.pixelSizeX ?? metadata.pixelSize,
75
+ metadata.pixelSizeY ?? metadata.pixelSize,
76
+ ),
77
+ ],
78
+ [t("inspector.mediaInspector.text019"), `${metadata.gridWidth || '—'}×${metadata.gridHeight || '—'}`],
79
+ ]
80
+ : []),
81
+ ...(Array.isArray(provenance.parents) && provenance.parents.length
82
+ ? [[
83
+ t("inspector.mediaInspector.text020"),
84
+ provenance.parents
85
+ .map((parent) => parent.assetId || parent.url || t("inspector.mediaInspector.text009"))
86
+ .join('\n'),
87
+ ]]
88
+ : []),
89
+ ])
90
+ if (provenance.prompt) {
91
+ const promptBox = el('div', 'insp-prompt')
92
+ promptBox.textContent = provenance.prompt
93
+ section.appendChild(promptBox)
94
+ }
95
+ return
96
+ }
97
+
98
+ const origin = resolveItemOrigin(item)
99
+ if (origin?.kind === 'video_cycle') {
100
+ const rows = [
101
+ [t("inspector.mediaInspector.text010"), t("inspector.mediaInspector.text021")],
102
+ [t("inspector.mediaInspector.text022"), originParentLabel(origin)],
103
+ [t("inspector.mediaInspector.text023"), formatOriginTime(origin.start)],
104
+ [t("inspector.mediaInspector.text024"), formatOriginTime(origin.end)],
105
+ ]
106
+ if (origin.score != null) rows.push([t("inspector.mediaInspector.text025"), `${(origin.score * 100).toFixed(2)}%`])
107
+ if (origin.threshold != null) {
108
+ rows.push([t("inspector.mediaInspector.text026"), `${(origin.threshold * 100).toFixed(1)}%`])
109
+ }
110
+ appendKv(section, rows)
111
+ return
112
+ }
113
+ if (origin?.kind === 'smart_split') {
114
+ appendKv(section, [
115
+ [t("inspector.mediaInspector.text010"), t("inspector.mediaInspector.text002")],
116
+ [t("inspector.mediaInspector.text027"), originParentLabel(origin)],
117
+ [t("inspector.mediaInspector.text028"), `${origin.resultIndex + 1} / ${origin.resultCount || 1}`],
118
+ ])
119
+ return
120
+ }
121
+
122
+ const gen = normalizeGenMeta(item.gen)
123
+ if (gen && (gen.prompt || gen.model)) {
124
+ appendKv(section, [
125
+ [t("inspector.mediaInspector.text010"), gen.kind === 'video' ? t("inspector.mediaInspector.text029") : t("inspector.mediaInspector.text005")],
126
+ ])
127
+ if (gen.prompt) {
128
+ const promptBox = el('div', 'insp-prompt')
129
+ promptBox.textContent = gen.prompt
130
+ section.appendChild(promptBox)
131
+ }
132
+ const rows = []
133
+ if (gen.model) rows.push([t("inspector.mediaInspector.text013"), gen.model])
134
+ if (gen.kind === 'video') {
135
+ if (gen.ratio) rows.push([t("inspector.mediaInspector.text030"), gen.ratio])
136
+ if (gen.resolution) rows.push([t("inspector.mediaInspector.text031"), gen.resolution])
137
+ if (gen.duration != null) {
138
+ rows.push([t("inspector.mediaInspector.text032"), Number(gen.duration) === -1 ? t("inspector.mediaInspector.text033") : `${gen.duration}s`])
139
+ }
140
+ rows.push([t("inspector.mediaInspector.text034"), gen.generateAudio ? t("inspector.mediaInspector.text035") : t("inspector.mediaInspector.text036")])
141
+ if (gen.seed != null && gen.seed !== '') rows.push([t('common.seed'), String(gen.seed)])
142
+ } else if (gen.size) {
143
+ rows.push([t("inspector.mediaInspector.text014"), gen.size])
144
+ }
145
+ rows.push([t("inspector.mediaInspector.text037"), formatGenRefList(gen.references)])
146
+ if (gen.createdAt) rows.push([t("inspector.mediaInspector.text038"), formatGenTime(gen.createdAt)])
147
+ appendKv(section, rows)
148
+ return
149
+ }
150
+
151
+ appendKv(section, [[t("inspector.mediaInspector.text010"), imageSourceLabel(item.id)]])
152
+ }
153
+
154
+ function mediaFileType(id) {
155
+ const filename = imageName(id)
156
+ const match = String(filename || id).match(/\.([^.?#/]+)(?:[?#].*)?$/)
157
+ if (!match) return t("inspector.mediaInspector.text009")
158
+ const extension = match[1].toLowerCase()
159
+ return ({
160
+ jpg: 'JPEG', jpeg: 'JPEG', png: 'PNG', webp: 'WebP', gif: 'GIF',
161
+ bmp: 'BMP', avif: 'AVIF', svg: 'SVG', mp4: 'MP4', webm: 'WebM',
162
+ mov: 'MOV', m4v: 'M4V',
163
+ })[extension] || extension.toUpperCase()
164
+ }
165
+
166
+ function formatSourceAssets(values) {
167
+ const ids = (Array.isArray(values) ? values : [])
168
+ .map((value) => typeof value === 'string' ? value : value?.assetId || value?.id || value?.url)
169
+ .filter(Boolean)
170
+ if (!ids.length) return ''
171
+ return ids.map((id) => imageName(id) || id).join('\n')
172
+ }
173
+
174
+ function sourceBoolean(value) {
175
+ return value === true ? t("inspector.mediaInspector.text035") : value === false ? t("inspector.mediaInspector.text036") : ''
176
+ }
177
+
178
+ function imageSourceFeature(item) {
179
+ const provenance = item?.provenance
180
+ const metadata = provenance?.metadata && typeof provenance.metadata === 'object'
181
+ ? provenance.metadata
182
+ : {}
183
+ if (metadata.pipeline === 'game_ui_components') return t("inspector.mediaInspector.text039")
184
+ if (metadata.pipeline === 'seamless_tile') return t("inspector.mediaInspector.text040")
185
+ if (metadata.pipeline === 'scroll_image') return t("features.generation.scrollImage.title")
186
+ if (metadata.pipeline === 'scroll_seam_elimination') return t("features.editing.scrollSeamElimination.title")
187
+ if (metadata.pipeline === 'tile_transition_atlas') return t("inspector.mediaInspector.text041")
188
+ if (metadata.pipeline === 'seam_elimination') return t("inspector.mediaInspector.text042")
189
+ if (provenance?.operation === 'generate_game_image' && metadata.interactiveEdit === true) {
190
+ return t("inspector.mediaInspector.text043")
191
+ }
192
+ const operationLabels = {
193
+ generate_game_image: t("inspector.mediaInspector.text044"),
194
+ generate_game_video: t("inspector.mediaInspector.text045"),
195
+ generate_game_ui_components: t("inspector.mediaInspector.text039"),
196
+ generate_character_four_view: t("inspector.mediaInspector.text046"),
197
+ generate_character_eight_direction: t("inspector.mediaInspector.text047"),
198
+ decompose_image_layers: t("inspector.mediaInspector.text048"),
199
+ cutout_game_image: t("inspector.mediaInspector.text049"),
200
+ smart_split: t("inspector.mediaInspector.text002"),
201
+ manual_split: t("inspector.mediaInspector.text003"),
202
+ video_frame_extract: t("inspector.mediaInspector.text050"),
203
+ frame_sheet_edit: t("inspector.mediaInspector.text051"),
204
+ color_key: t("inspector.mediaInspector.text052"),
205
+ perfect_pixel: t("inspector.mediaInspector.text053"),
206
+ image_canvas_resize: t("inspector.mediaInspector.text054"),
207
+ interactive_edit: t("inspector.mediaInspector.text043"),
208
+ copy: t("inspector.mediaInspector.text055"),
209
+ upload: t("inspector.mediaInspector.text008"),
210
+ video_frame: t("inspector.mediaInspector.text056"),
211
+ video_cycle: t("inspector.mediaInspector.text057"),
212
+ tile_transition_atlas: t("inspector.mediaInspector.text041"),
213
+ }
214
+ if (provenance?.operation && operationLabels[provenance.operation]) {
215
+ return operationLabels[provenance.operation]
216
+ }
217
+ const sourceLabels = {
218
+ existing: t("inspector.mediaInspector.text058"), generated: t("inspector.mediaInspector.text044"), edited: t("inspector.mediaInspector.text006"),
219
+ copied: t("inspector.mediaInspector.text055"), uploaded: t("inspector.mediaInspector.text008"),
220
+ }
221
+ if (provenance?.source && sourceLabels[provenance.source]) return sourceLabels[provenance.source]
222
+ const origin = resolveItemOrigin(item)
223
+ if (origin?.kind === 'smart_split') return t("inspector.mediaInspector.text002")
224
+ const gen = normalizeGenMeta(item?.gen)
225
+ if (gen?.kind === 'image') return t("inspector.mediaInspector.text044")
226
+ return imageSourceLabel(item?.id)
227
+ }
228
+
229
+ function imageSourceInput(item) {
230
+ const provenance = item?.provenance
231
+ const metadata = provenance?.metadata && typeof provenance.metadata === 'object'
232
+ ? provenance.metadata
233
+ : {}
234
+ const gen = normalizeGenMeta(item?.gen)
235
+ const operation = String(provenance?.operation || '')
236
+ const rows = []
237
+ const add = (label, value) => {
238
+ if (value !== undefined && value !== null && value !== '') rows.push([label, String(value)])
239
+ }
240
+ const pipelineUi = metadata.pipeline === 'game_ui_components'
241
+ const metadataReferences = formatSourceAssets(metadata.referenceIds)
242
+ const parentReferences = formatSourceAssets(provenance?.parents)
243
+ const genReferences = gen ? formatGenRefList(gen.references) : ''
244
+ const references = metadataReferences || parentReferences || (genReferences === '无' ? '' : genReferences)
245
+ const prompt = String(
246
+ provenance?.prompt || gen?.prompt || metadata.userPrompt || '',
247
+ ).trim()
248
+
249
+ if (pipelineUi) {
250
+ add(t("inspector.mediaInspector.text059"), references)
251
+ add(t("inspector.mediaInspector.text013"), metadata.imageModel || provenance?.imageModel || gen?.model)
252
+ add(t("inspector.mediaInspector.text060"), metadata.size || provenance?.size || gen?.size)
253
+ add(t("inspector.mediaInspector.text061"), metadata.transparentBackground === true ? t("inspector.mediaInspector.text062") : metadata.backgroundColor)
254
+ add(t("inspector.mediaInspector.text063"), sourceBoolean(metadata.autoSplit))
255
+ return { prompt, rows }
256
+ }
257
+
258
+ if (metadata.pipeline === 'seamless_tile') {
259
+ add(t("inspector.mediaInspector.text064"), sourceBoolean(metadata.seamEliminationEnabled))
260
+ add(t("inspector.mediaInspector.text013"), provenance?.imageModel || gen?.model)
261
+ add(t("inspector.mediaInspector.text060"), provenance?.size || gen?.size)
262
+ return { prompt, rows }
263
+ }
264
+
265
+ if (metadata.pipeline === 'scroll_image') {
266
+ add(t("inspector.mediaInspector.text013"), provenance?.imageModel || gen?.model)
267
+ add(t("inspector.mediaInspector.text060"), provenance?.size || gen?.size)
268
+ return { prompt, rows }
269
+ }
270
+
271
+ if (metadata.pipeline === 'tile_transition_atlas') {
272
+ add(t("inspector.mediaInspector.text065"), formatSourceAssets([metadata.terrainZeroAssetId]))
273
+ add(t("inspector.mediaInspector.text066"), formatSourceAssets([metadata.terrainOneAssetId]))
274
+ add(t("inspector.mediaInspector.text067"), metadata.tileSize ? `${metadata.tileSize} × ${metadata.tileSize}` : '')
275
+ add(t("inspector.mediaInspector.text013"), metadata.imageModel || provenance?.imageModel)
276
+ return { prompt, rows }
277
+ }
278
+
279
+ if (metadata.pipeline === 'seam_elimination') {
280
+ add(t("inspector.mediaInspector.text068"), references)
281
+ return { prompt: '', rows }
282
+ }
283
+
284
+ if (references) {
285
+ add(
286
+ ['generate_game_image', 'generate_character_four_view', 'generate_character_eight_direction', 'decompose_image_layers'].includes(operation)
287
+ ? t("inspector.mediaInspector.text059")
288
+ : operation === 'video_frame_extract' ? t("inspector.mediaInspector.text069") : t("inspector.mediaInspector.text068"),
289
+ references,
290
+ )
291
+ }
292
+
293
+ if (
294
+ ['generate_game_image', 'generate_game_ui_components', 'generate_character_four_view',
295
+ 'generate_character_eight_direction', 'decompose_image_layers'].includes(operation) || gen
296
+ ) {
297
+ add(t("inspector.mediaInspector.text013"), provenance?.imageModel || gen?.model)
298
+ add(t("inspector.mediaInspector.text060"), provenance?.size || gen?.size)
299
+ }
300
+
301
+ if (operation === 'generate_game_image') {
302
+ const background = metadata.background || (metadata.interactiveEdit === true ? '' : 'auto')
303
+ add(t("inspector.mediaInspector.text061"), ({ auto: t("inspector.mediaInspector.text033"), transparent: t("inspector.mediaInspector.text062"), opaque: t("inspector.mediaInspector.text070") })[background] || background)
304
+ } else if (operation === 'generate_character_four_view' || operation === 'generate_character_eight_direction') {
305
+ add(t("inspector.mediaInspector.text061"), metadata.transparentBackground === true ? t("inspector.mediaInspector.text062") : metadata.backgroundColor)
306
+ } else if (operation === 'smart_split') {
307
+ add(t("inspector.mediaInspector.text071"), sourceBoolean(metadata.padToSameSize))
308
+ if (metadata.padToSameSize !== false) {
309
+ add(t("inspector.mediaInspector.text072"), {
310
+ center: t("inspector.mediaInspector.text073"), top: t("inspector.mediaInspector.text074"), bottom: t("inspector.mediaInspector.text075"), left: t("inspector.mediaInspector.text076"), right: t("inspector.mediaInspector.text077"),
311
+ 'top-left': t("inspector.mediaInspector.text078"), 'top-right': t("inspector.mediaInspector.text079"), 'bottom-left': t("inspector.mediaInspector.text080"), 'bottom-right': t("inspector.mediaInspector.text081"),
312
+ }[metadata.anchor] || metadata.anchor)
313
+ }
314
+ } else if (operation === 'manual_split') {
315
+ if (metadata.rows && metadata.columns) add(t("inspector.mediaInspector.text082"), `${metadata.rows} × ${metadata.columns}`)
316
+ } else if (operation === 'video_frame_extract') {
317
+ add(t('common.framesPerSecond'), metadata.fps)
318
+ add(t("inspector.mediaInspector.text083"), metadata.frameCount)
319
+ } else if (operation === 'frame_sheet_edit') {
320
+ if (metadata.sourceRows && metadata.sourceColumns) {
321
+ add(t("inspector.mediaInspector.text084"), `${metadata.sourceRows} × ${metadata.sourceColumns}`)
322
+ }
323
+ if (metadata.rows && metadata.columns) add(t("inspector.mediaInspector.text085"), `${metadata.rows} × ${metadata.columns}`)
324
+ add(t("inspector.mediaInspector.text086"), metadata.frameCount)
325
+ add(t('common.framesPerSecond'), metadata.fps)
326
+ } else if (operation === 'color_key') {
327
+ add(t("inspector.mediaInspector.text087"), metadata.color)
328
+ add(t("inspector.mediaInspector.text088"), metadata.strength)
329
+ } else if (operation === 'perfect_pixel') {
330
+ add(t("inspector.mediaInspector.text015"), metadata.autoGrid === true ? t("inspector.mediaInspector.text016") : t("inspector.mediaInspector.text017"))
331
+ add(t("inspector.mediaInspector.text089"), formatPerfectPixelSourceArea(
332
+ metadata.pixelSizeX ?? metadata.pixelSize,
333
+ metadata.pixelSizeY ?? metadata.pixelSize,
334
+ ))
335
+ add(t("inspector.mediaInspector.text090"), {
336
+ majority: t("inspector.mediaInspector.text091"), median: t("inspector.mediaInspector.text092"), center: t("inspector.mediaInspector.text093"),
337
+ }[metadata.sampleMethod] || metadata.sampleMethod)
338
+ add(t("inspector.mediaInspector.text094"), metadata.exportScale ? `${metadata.exportScale}×` : '')
339
+ add(t("inspector.mediaInspector.text095"), metadata.alphaMode === 'hard'
340
+ ? `${t("inspector.mediaInspector.text096")}${metadata.alphaThreshold ?? '—'}${t("inspector.mediaInspector.text096.part1")}`
341
+ : metadata.alphaMode === 'preserve' ? t("inspector.mediaInspector.text097") : '')
342
+ } else if (operation === 'image_canvas_resize') {
343
+ if (metadata.sourceWidth && metadata.sourceHeight) {
344
+ add(t("inspector.mediaInspector.text098"), `${metadata.sourceWidth} × ${metadata.sourceHeight}`)
345
+ }
346
+ if (metadata.width && metadata.height) {
347
+ add(t("inspector.mediaInspector.text099"), `${metadata.width} × ${metadata.height}`)
348
+ }
349
+ add(t("inspector.mediaInspector.text100"), `${Number(metadata.left) >= 0 ? '+' : ''}${metadata.left} px`)
350
+ add(t("inspector.mediaInspector.text101"), `${Number(metadata.top) >= 0 ? '+' : ''}${metadata.top} px`)
351
+ add(t("inspector.mediaInspector.text102"), `${Number(metadata.right) >= 0 ? '+' : ''}${metadata.right} px`)
352
+ add(t("inspector.mediaInspector.text103"), `${Number(metadata.bottom) >= 0 ? '+' : ''}${metadata.bottom} px`)
353
+ }
354
+
355
+ const origin = resolveItemOrigin(item)
356
+ if (!provenance && origin?.kind === 'smart_split') {
357
+ add(t("inspector.mediaInspector.text068"), originParentLabel(origin))
358
+ }
359
+ return { prompt, rows }
360
+ }
361
+
362
+ function appendImageSourceBlock(container, item) {
363
+ const block = createInspectorBlock(t("inspector.mediaInspector.text001"))
364
+ appendKv(block, [[t("inspector.mediaInspector.text104"), imageSourceFeature(item)]])
365
+ const input = imageSourceInput(item)
366
+ if (input.prompt) {
367
+ block.appendChild(el('div', 'insp-input-label', t("inspector.mediaInspector.text105")))
368
+ const promptBox = el('div', 'insp-prompt')
369
+ promptBox.textContent = input.prompt
370
+ block.appendChild(promptBox)
371
+ }
372
+ if (input.rows.length) appendKv(block, input.rows)
373
+ container.appendChild(block)
374
+ }
375
+
376
+ function appendImageEditBlock(container, item) {
377
+ const frameConfig = normalizeFramePreviewConfig(item?.framePreview)
378
+ const scrollConfig = normalizeScrollPreviewConfig(item?.scrollPreview)
379
+ if (!frameConfig && !scrollConfig) return false
380
+ const block = createInspectorBlock(t("inspector.mediaInspector.text106"))
381
+ if (frameConfig) block.appendChild(createFramePreviewParameterModule(item, frameConfig))
382
+ if (scrollConfig) block.appendChild(createScrollPreviewParameterModule(item, scrollConfig))
383
+ container.appendChild(block)
384
+ return true
385
+ }
386
+
387
+ function ensureVideoMeta(id) {
388
+ if (!id || state.videoMeta[id]) return
389
+ state.videoMeta[id] = { loading: true }
390
+ const video = document.createElement('video')
391
+ video.preload = 'metadata'
392
+ video.onloadedmetadata = () => {
393
+ state.videoMeta[id] = {
394
+ w: video.videoWidth,
395
+ h: video.videoHeight,
396
+ duration: Number.isFinite(video.duration) ? video.duration : 0,
397
+ }
398
+ video.removeAttribute('src')
399
+ video.load()
400
+ if (state.selectedIds.has(id)) renderInspector()
401
+ }
402
+ video.onerror = () => {
403
+ state.videoMeta[id] = { w: 0, h: 0, duration: 0 }
404
+ if (state.selectedIds.has(id)) renderInspector()
405
+ }
406
+ video.src = imageUrl(id)
407
+ }
408
+
409
+ function formatVideoDuration(id) {
410
+ const metadata = state.videoMeta[id]
411
+ if (!metadata || metadata.loading) return t("inspector.mediaInspector.text107")
412
+ const duration = Number(metadata.duration)
413
+ if (!Number.isFinite(duration) || duration <= 0) return t("inspector.mediaInspector.text009")
414
+ const totalSeconds = Math.round(duration)
415
+ const hours = Math.floor(totalSeconds / 3600)
416
+ const minutes = Math.floor((totalSeconds % 3600) / 60)
417
+ const seconds = totalSeconds % 60
418
+ if (hours) return `${hours}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`
419
+ return `${minutes}:${String(seconds).padStart(2, '0')}`
420
+ }
421
+
422
+ function videoResolutionTier(width, height) {
423
+ const shortSide = Math.min(Number(width) || 0, Number(height) || 0)
424
+ if (shortSide >= 2160) return '4K'
425
+ if (shortSide >= 1440) return '1440p'
426
+ if (shortSide >= 1080) return '1080p'
427
+ if (shortSide >= 720) return '720p'
428
+ if (shortSide >= 480) return '480p'
429
+ if (shortSide > 0) return `${shortSide}p`
430
+ return ''
431
+ }
432
+
433
+ function formatVideoResolution(id, item) {
434
+ const metadata = state.videoMeta[id]
435
+ if (!metadata || metadata.loading) return t("inspector.mediaInspector.text107")
436
+ if (metadata.w && metadata.h) {
437
+ const tier = videoResolutionTier(metadata.w, metadata.h)
438
+ return `${metadata.w} × ${metadata.h}${tier ? ` · ${tier}` : ''}`
439
+ }
440
+ const gen = normalizeGenMeta(item?.gen)
441
+ return gen?.resolution || item?.provenance?.metadata?.resolution || t("inspector.mediaInspector.text009")
442
+ }
443
+
444
+ function videoSourceFeature(item) {
445
+ const operation = item?.provenance?.operation
446
+ if (operation === 'generate_game_video') return t("inspector.mediaInspector.text045")
447
+ if (operation === 'video_cycle') return t("inspector.mediaInspector.text057")
448
+ if (operation === 'copy') return t("inspector.mediaInspector.text108")
449
+ if (operation === 'upload') return t("inspector.mediaInspector.text008")
450
+ const sourceLabels = {
451
+ existing: t("inspector.mediaInspector.text058"), generated: t("inspector.mediaInspector.text045"), edited: t("inspector.mediaInspector.text109"),
452
+ copied: t("inspector.mediaInspector.text108"), uploaded: t("inspector.mediaInspector.text008"),
453
+ }
454
+ if (item?.provenance?.source && sourceLabels[item.provenance.source]) {
455
+ return sourceLabels[item.provenance.source]
456
+ }
457
+ return normalizeGenMeta(item?.gen)?.kind === 'video' ? t("inspector.mediaInspector.text045") : imageSourceLabel(item?.id)
458
+ }
459
+
460
+ function videoSourceInput(item) {
461
+ const provenance = item?.provenance
462
+ const metadata = provenance?.metadata && typeof provenance.metadata === 'object'
463
+ ? provenance.metadata
464
+ : {}
465
+ const gen = normalizeGenMeta(item?.gen)
466
+ const rows = []
467
+ const add = (label, value) => {
468
+ if (value !== undefined && value !== null && value !== '') rows.push([label, String(value)])
469
+ }
470
+ const genReferences = gen ? formatGenRefList(gen.references) : ''
471
+ const references = formatSourceAssets(provenance?.parents) || (genReferences === '无' ? '' : genReferences)
472
+ const prompt = String(provenance?.prompt || gen?.prompt || '').trim()
473
+
474
+ if (provenance?.operation === 'generate_game_video' || gen?.kind === 'video') {
475
+ add(t("inspector.mediaInspector.text110"), references)
476
+ add(t("inspector.mediaInspector.text013"), provenance?.imageModel || gen?.model)
477
+ add(t("inspector.mediaInspector.text030"), metadata.ratio || gen?.ratio)
478
+ const duration = metadata.duration ?? gen?.duration
479
+ add(t("inspector.mediaInspector.text111"), duration == null ? '' : Number(duration) === -1 ? t("inspector.mediaInspector.text033") : `${duration}s`)
480
+ add(t("inspector.mediaInspector.text112"), metadata.resolution || gen?.resolution)
481
+ add(t("inspector.mediaInspector.text034"), sourceBoolean(metadata.generateAudio ?? gen?.generateAudio))
482
+ add(t('common.seed'), metadata.seed ?? gen?.seed)
483
+ } else if (provenance?.operation === 'video_cycle') {
484
+ add(t("inspector.mediaInspector.text069"), references)
485
+ add(t("inspector.mediaInspector.text113"), metadata.threshold)
486
+ add(t("inspector.mediaInspector.text114"), metadata.minGapSec != null ? `${metadata.minGapSec}s` : '')
487
+ } else {
488
+ add(t("inspector.mediaInspector.text069"), references)
489
+ }
490
+ return { prompt, rows }
491
+ }
492
+
493
+ function appendVideoSourceBlock(container, item) {
494
+ const block = createInspectorBlock(t("inspector.mediaInspector.text001"), { collapseKey: t("inspector.mediaInspector.text115") })
495
+ appendKv(block, [[t("inspector.mediaInspector.text104"), videoSourceFeature(item)]])
496
+ const input = videoSourceInput(item)
497
+ if (input.prompt) {
498
+ block.appendChild(el('div', 'insp-input-label', t("inspector.mediaInspector.text105")))
499
+ const promptBox = el('div', 'insp-prompt')
500
+ promptBox.textContent = input.prompt
501
+ block.appendChild(promptBox)
502
+ }
503
+ if (input.rows.length) appendKv(block, input.rows)
504
+ container.appendChild(block)
505
+ }
506
+
507
+ return {
508
+ appendImageEditBlock,
509
+ appendImageSourceBlock,
510
+ appendVideoSourceBlock,
511
+ ensureVideoMeta,
512
+ formatVideoDuration,
513
+ formatVideoResolution,
514
+ imageSourceInput,
515
+ mediaFileType,
516
+ }
517
+ }
@@ -0,0 +1,56 @@
1
+ import { t } from '../language/index.js'
2
+ import {
3
+ notifyFeatureState,
4
+ ensureFeatureState,
5
+ discardFeatureState,
6
+ serializeFeatureState,
7
+ } from '../core/feature-state.js'
8
+ import { mountFeatureForm } from '../ui/feature-form.js'
9
+ import { createInspectorBlock } from './controls.js'
10
+
11
+ export function createMediaPreviewParameterModule(
12
+ services,
13
+ { definition, apply, collapseKey },
14
+ ) {
15
+ return function createParameterModule(item, config) {
16
+ const module = createInspectorBlock(t(definition.title), {
17
+ collapseKey,
18
+ className: 'insp-param-module',
19
+ })
20
+ const input = {
21
+ transient: true,
22
+ id: `${definition.id}:${item.id}`,
23
+ type: 'feature_dialog',
24
+ featureId: definition.id,
25
+ parameters: config,
26
+ }
27
+ discardFeatureState(input)
28
+ ensureFeatureState(input, definition)
29
+ const dispose = mountFeatureForm(module, input, definition, {
30
+ ...services,
31
+ save: () => {},
32
+ reportError: (error) => {
33
+ ensureFeatureState(input).messages.push({ error: String(error?.message || error) })
34
+ notifyFeatureState(input.id)
35
+ },
36
+ submit: async () => {
37
+ const params = ensureFeatureState(input)
38
+ if (params.busy) return
39
+ params.busy = true
40
+ notifyFeatureState(input.id)
41
+ try {
42
+ await apply(item, serializeFeatureState(input), services)
43
+ services.renderChrome()
44
+ } finally {
45
+ params.busy = false
46
+ notifyFeatureState(input.id)
47
+ }
48
+ },
49
+ })
50
+ module.querySelector('[data-feature-form]')._disposeFeatureForm = () => {
51
+ dispose()
52
+ discardFeatureState(input)
53
+ }
54
+ return module
55
+ }
56
+ }
@@ -0,0 +1,96 @@
1
+ import { t } from '../language/index.js'
2
+ const NUMBER_INPUT_SELECTOR = 'input[type="number"]:not([data-unified-stepper])'
3
+
4
+ function decimalPlaces(value) {
5
+ const text = String(value || '')
6
+ if (/e-/i.test(text)) return Math.max(0, Number(text.split(/e-/i)[1]) || 0)
7
+ return (text.split('.')[1] || '').length
8
+ }
9
+
10
+ function fallbackStep(input, direction) {
11
+ const current = Number(input.value)
12
+ const minimum = input.min === '' ? -Infinity : Number(input.min)
13
+ const maximum = input.max === '' ? Infinity : Number(input.max)
14
+ const rawStep = Number(input.step)
15
+ const step = Number.isFinite(rawStep) && rawStep > 0 ? rawStep : 1
16
+ const base = Number.isFinite(current) ? current : Number.isFinite(minimum) ? minimum : 0
17
+ let next = base + direction * step
18
+ // Inputs such as FPS use a tiny positive minimum only to reject zero. Moving
19
+ // up from that boundary should produce a useful whole step, not 1.000001.
20
+ if (direction > 0 && base === minimum && minimum > 0 && minimum < step) next = step
21
+ next = Math.min(maximum, Math.max(minimum, next))
22
+ const precision = Math.min(12, Math.max(decimalPlaces(step), decimalPlaces(base)))
23
+ input.value = String(Number(next.toFixed(precision)))
24
+ }
25
+
26
+ function changeNumber(input, direction) {
27
+ if (input.disabled || input.readOnly) return
28
+ try {
29
+ if (direction > 0) input.stepUp()
30
+ else input.stepDown()
31
+ } catch {
32
+ fallbackStep(input, direction)
33
+ }
34
+ input.dispatchEvent(new Event('input', { bubbles: true }))
35
+ input.dispatchEvent(new Event('change', { bubbles: true }))
36
+ input.focus({ preventScroll: true })
37
+ }
38
+
39
+ function stepButton(input, direction) {
40
+ const label = input.getAttribute('aria-label') || t("inspector.numberStepper.text001")
41
+ const button = document.createElement('button')
42
+ button.type = 'button'
43
+ button.className = `ui-number-stepper-button is-${direction > 0 ? 'up' : 'down'}`
44
+ button.tabIndex = -1
45
+ button.setAttribute('aria-label', `${direction > 0 ? t("inspector.numberStepper.text002") : t("inspector.numberStepper.text003")}${label}`)
46
+ button.innerHTML = direction > 0
47
+ ? '<svg viewBox="0 0 12 8" aria-hidden="true"><path d="m2 6 4-4 4 4"/></svg>'
48
+ : '<svg viewBox="0 0 12 8" aria-hidden="true"><path d="m2 2 4 4 4-4"/></svg>'
49
+ button.addEventListener('pointerdown', (event) => event.stopPropagation())
50
+ button.addEventListener('click', (event) => {
51
+ event.preventDefault()
52
+ event.stopPropagation()
53
+ changeNumber(input, direction)
54
+ })
55
+ return button
56
+ }
57
+
58
+ function enhanceNumberInput(input) {
59
+ if (!(input instanceof HTMLInputElement) || input.dataset.unifiedStepper) return
60
+ input.dataset.unifiedStepper = 'true'
61
+ const parent = input.parentNode
62
+ if (!parent) return
63
+
64
+ const rect = input.getBoundingClientRect()
65
+ const parentWidth = input.parentElement?.getBoundingClientRect().width || 0
66
+ const computedWidth = Number.parseFloat(getComputedStyle(input).width)
67
+ const fluid = parentWidth > 0 && rect.width / parentWidth >= 0.8
68
+ const wrapper = document.createElement('span')
69
+ wrapper.className = 'ui-number-stepper'
70
+ if (fluid || (!rect.width && !computedWidth)) wrapper.classList.add('is-fluid')
71
+ else wrapper.style.width = `${rect.width || computedWidth}px`
72
+
73
+ parent.insertBefore(wrapper, input)
74
+ wrapper.append(input)
75
+ const controls = document.createElement('span')
76
+ controls.className = 'ui-number-stepper-controls'
77
+ controls.append(stepButton(input, 1), stepButton(input, -1))
78
+ wrapper.appendChild(controls)
79
+ }
80
+
81
+ function enhanceTree(root) {
82
+ if (root instanceof HTMLInputElement && root.matches(NUMBER_INPUT_SELECTOR)) enhanceNumberInput(root)
83
+ if (!(root instanceof Element || root instanceof Document)) return
84
+ for (const input of root.querySelectorAll(NUMBER_INPUT_SELECTOR)) enhanceNumberInput(input)
85
+ }
86
+
87
+ export function initUnifiedNumberSteppers() {
88
+ enhanceTree(document)
89
+ const observer = new MutationObserver((records) => {
90
+ for (const record of records) {
91
+ for (const node of record.addedNodes) enhanceTree(node)
92
+ }
93
+ })
94
+ observer.observe(document.documentElement, { childList: true, subtree: true })
95
+ return () => observer.disconnect()
96
+ }