dsh-drawai 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/LICENSE +4142 -0
  2. package/README.md +43 -10
  3. package/lib/audio-media.js +147 -0
  4. package/lib/audio-service.js +66 -0
  5. package/lib/canvas-format.js +134 -0
  6. package/lib/client.js +5283 -223
  7. package/lib/comfyui-default-workflow.mjs +1825 -0
  8. package/lib/comfyui-workflow.mjs +426 -0
  9. package/lib/document-commands.js +12 -0
  10. package/lib/document-core.js +29 -0
  11. package/lib/drawing-tasks.js +26 -0
  12. package/lib/imagegen.mjs +596 -0
  13. package/lib/index.js +1758 -129
  14. package/lib/media.js +26 -13
  15. package/lib/mgstyle-core.js +75 -0
  16. package/lib/motion/apply.js +180 -0
  17. package/lib/motion/asset-pack-lock.js +10 -0
  18. package/lib/motion/asset-pack.js +335 -0
  19. package/lib/motion/assets.js +290 -0
  20. package/lib/motion/audio.js +103 -0
  21. package/lib/motion/audiolevel.js +63 -0
  22. package/lib/motion/audiomix.js +144 -0
  23. package/lib/motion/beats.js +337 -0
  24. package/lib/motion/builtin-assets.js +62 -0
  25. package/lib/motion/canvas-spec.js +442 -0
  26. package/lib/motion/capture.js +95 -0
  27. package/lib/motion/cards.js +80 -0
  28. package/lib/motion/collect.js +447 -0
  29. package/lib/motion/delivery.js +112 -0
  30. package/lib/motion/edge-speech.py +90 -0
  31. package/lib/motion/entry.jsx +73 -0
  32. package/lib/motion/export.js +200 -0
  33. package/lib/motion/ffmpeg.js +42 -0
  34. package/lib/motion/fonts.js +71 -0
  35. package/lib/motion/jobs.js +113 -0
  36. package/lib/motion/json.js +4 -0
  37. package/lib/motion/media-catalog.js +59 -0
  38. package/lib/motion/mgstyles/BRIEF-TEMPLATE.md +63 -0
  39. package/lib/motion/mgstyles/briefs/01-flat-vector.md +104 -0
  40. package/lib/motion/mgstyles/briefs/02-line-art.md +97 -0
  41. package/lib/motion/mgstyles/briefs/03-isometric.md +108 -0
  42. package/lib/motion/mgstyles/briefs/05-cel-boil.md +145 -0
  43. package/lib/motion/mgstyles/briefs/06-collage.md +149 -0
  44. package/lib/motion/mgstyles/briefs/07-liquid.md +106 -0
  45. package/lib/motion/mgstyles/briefs/08-morph.md +111 -0
  46. package/lib/motion/mgstyles/briefs/09-bauhaus.md +150 -0
  47. package/lib/motion/mgstyles/briefs/10-synthwave.md +151 -0
  48. package/lib/motion/mgstyles/briefs/12-aurora-glass.md +147 -0
  49. package/lib/motion/mgstyles/briefs/18-hanazi.md +140 -0
  50. package/lib/motion/mgstyles/briefs/19-paperclip.md +156 -0
  51. package/lib/motion/mgstyles/briefs/20-pixel.md +118 -0
  52. package/lib/motion/mgstyles/briefs/22-hud.md +118 -0
  53. package/lib/motion/mgstyles/catalog.d/01-flat-vector.json +34 -0
  54. package/lib/motion/mgstyles/catalog.d/02-line-art.json +34 -0
  55. package/lib/motion/mgstyles/catalog.d/03-isometric.json +35 -0
  56. package/lib/motion/mgstyles/catalog.d/05-cel-boil.json +28 -0
  57. package/lib/motion/mgstyles/catalog.d/06-collage.json +28 -0
  58. package/lib/motion/mgstyles/catalog.d/07-liquid.json +28 -0
  59. package/lib/motion/mgstyles/catalog.d/08-morph.json +28 -0
  60. package/lib/motion/mgstyles/catalog.d/09-bauhaus.json +28 -0
  61. package/lib/motion/mgstyles/catalog.d/10-synthwave.json +28 -0
  62. package/lib/motion/mgstyles/catalog.d/12-aurora-glass.json +28 -0
  63. package/lib/motion/mgstyles/catalog.d/18-hanazi.json +28 -0
  64. package/lib/motion/mgstyles/catalog.d/19-paperclip.json +28 -0
  65. package/lib/motion/mgstyles/catalog.d/20-pixel.json +28 -0
  66. package/lib/motion/mgstyles/catalog.d/22-hud.json +28 -0
  67. package/lib/motion/mgstyles/catalog.json +1356 -0
  68. package/lib/motion/mgstyles/upstream/README.md +147 -0
  69. package/lib/motion/mgstyles/upstream/README.zh-CN.md +147 -0
  70. package/lib/motion/mgstyles/upstream/demos/01-flat-vector/cues.json +1 -0
  71. package/lib/motion/mgstyles/upstream/demos/01-flat-vector/index.html +712 -0
  72. package/lib/motion/mgstyles/upstream/demos/02-line-art/cues.json +331 -0
  73. package/lib/motion/mgstyles/upstream/demos/02-line-art/film.js +676 -0
  74. package/lib/motion/mgstyles/upstream/demos/02-line-art/index.html +18 -0
  75. package/lib/motion/mgstyles/upstream/demos/02-line-art/tools/dump_timing.mjs +26 -0
  76. package/lib/motion/mgstyles/upstream/demos/03-isometric/cues.json +109 -0
  77. package/lib/motion/mgstyles/upstream/demos/03-isometric/index.html +25 -0
  78. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/anim.js +82 -0
  79. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/main.js +219 -0
  80. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/night5.js +180 -0
  81. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/render.js +202 -0
  82. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/title.js +167 -0
  83. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/title5.js +294 -0
  84. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/ui.js +141 -0
  85. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/world.js +1399 -0
  86. package/lib/motion/mgstyles/upstream/demos/05-cel-boil/cues.json +157 -0
  87. package/lib/motion/mgstyles/upstream/demos/05-cel-boil/index.html +34 -0
  88. package/lib/motion/mgstyles/upstream/demos/05-cel-boil/js/engine.js +326 -0
  89. package/lib/motion/mgstyles/upstream/demos/05-cel-boil/js/scene.js +2036 -0
  90. package/lib/motion/mgstyles/upstream/demos/06-collage/assets/gen/layout.json +157 -0
  91. package/lib/motion/mgstyles/upstream/demos/06-collage/cues.json +80 -0
  92. package/lib/motion/mgstyles/upstream/demos/06-collage/index.html +889 -0
  93. package/lib/motion/mgstyles/upstream/demos/07-liquid/cues.json +100 -0
  94. package/lib/motion/mgstyles/upstream/demos/07-liquid/index.html +108 -0
  95. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/engine.js +153 -0
  96. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/links.js +64 -0
  97. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/lookdev.js +46 -0
  98. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/scene.js +963 -0
  99. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/shaders.js +647 -0
  100. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/textsdf.js +114 -0
  101. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/type.js +50 -0
  102. package/lib/motion/mgstyles/upstream/demos/08-morph/cues.json +131 -0
  103. package/lib/motion/mgstyles/upstream/demos/08-morph/glyphs.json +1 -0
  104. package/lib/motion/mgstyles/upstream/demos/08-morph/index.html +901 -0
  105. package/lib/motion/mgstyles/upstream/demos/09-bauhaus/cues.json +270 -0
  106. package/lib/motion/mgstyles/upstream/demos/09-bauhaus/film.js +697 -0
  107. package/lib/motion/mgstyles/upstream/demos/09-bauhaus/index.html +12 -0
  108. package/lib/motion/mgstyles/upstream/demos/10-synthwave/cues.json +44 -0
  109. package/lib/motion/mgstyles/upstream/demos/10-synthwave/index.html +1028 -0
  110. package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/cues.json +67 -0
  111. package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/index.html +16 -0
  112. package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/main.js +967 -0
  113. package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/shaders.js +468 -0
  114. package/lib/motion/mgstyles/upstream/demos/18-hanazi/cues.json +117 -0
  115. package/lib/motion/mgstyles/upstream/demos/18-hanazi/index.html +541 -0
  116. package/lib/motion/mgstyles/upstream/demos/19-paperclip/assets/countries-110m.json +1 -0
  117. package/lib/motion/mgstyles/upstream/demos/19-paperclip/assets/stickers/meta.json +34 -0
  118. package/lib/motion/mgstyles/upstream/demos/19-paperclip/cues.json +285 -0
  119. package/lib/motion/mgstyles/upstream/demos/19-paperclip/index.html +599 -0
  120. package/lib/motion/mgstyles/upstream/demos/20-pixel/cues.json +42 -0
  121. package/lib/motion/mgstyles/upstream/demos/20-pixel/film.js +914 -0
  122. package/lib/motion/mgstyles/upstream/demos/20-pixel/index.html +18 -0
  123. package/lib/motion/mgstyles/upstream/demos/22-hud/cues.json +108 -0
  124. package/lib/motion/mgstyles/upstream/demos/22-hud/index.html +125 -0
  125. package/lib/motion/mgstyles/upstream/demos/22-hud/js/holo.js +275 -0
  126. package/lib/motion/mgstyles/upstream/demos/22-hud/js/hud.js +855 -0
  127. package/lib/motion/mgstyles/upstream/demos/22-hud/js/post.js +150 -0
  128. package/lib/motion/mgstyles/upstream/demos/22-hud/js/util.js +65 -0
  129. package/lib/motion/mgstyles/upstream/demos/22-hud/js/v5.js +142 -0
  130. package/lib/motion/mgstyles/upstream/harness/render.mjs +319 -0
  131. package/lib/motion/mgstyles/upstream/manifest.json +269 -0
  132. package/lib/motion/mgstyles/upstream/prompts/01-flat-vector.md +98 -0
  133. package/lib/motion/mgstyles/upstream/prompts/02-line-art.md +95 -0
  134. package/lib/motion/mgstyles/upstream/prompts/03-isometric.md +97 -0
  135. package/lib/motion/mgstyles/upstream/prompts/05-cel-boil.md +95 -0
  136. package/lib/motion/mgstyles/upstream/prompts/06-collage.md +95 -0
  137. package/lib/motion/mgstyles/upstream/prompts/07-liquid.md +98 -0
  138. package/lib/motion/mgstyles/upstream/prompts/08-morph.md +95 -0
  139. package/lib/motion/mgstyles/upstream/prompts/09-bauhaus.md +96 -0
  140. package/lib/motion/mgstyles/upstream/prompts/10-synthwave.md +95 -0
  141. package/lib/motion/mgstyles/upstream/prompts/12-aurora-glass.md +96 -0
  142. package/lib/motion/mgstyles/upstream/prompts/18-hanazi.md +95 -0
  143. package/lib/motion/mgstyles/upstream/prompts/19-paperclip.md +96 -0
  144. package/lib/motion/mgstyles/upstream/prompts/20-pixel.md +96 -0
  145. package/lib/motion/mgstyles/upstream/prompts/22-hud.md +95 -0
  146. package/lib/motion/mgstyles/upstream/rubric.md +51 -0
  147. package/lib/motion/mgstyles/upstream/template.md +36 -0
  148. package/lib/motion/pixelqa.js +198 -0
  149. package/lib/motion/preview.js +95 -0
  150. package/lib/motion/project.js +395 -0
  151. package/lib/motion/qa.js +290 -0
  152. package/lib/motion/reference-media.jsx +10 -0
  153. package/lib/motion/render-settings.js +112 -0
  154. package/lib/motion/render.js +159 -0
  155. package/lib/motion/scene-kit.js +183 -0
  156. package/lib/motion/sfx.js +232 -0
  157. package/lib/motion/shotcraft/ClipCard.tsx +204 -0
  158. package/lib/motion/shotcraft/catalog.json +2461 -0
  159. package/lib/motion/shotcraft/upstream/SKILL.md +286 -0
  160. package/lib/motion/shotcraft/upstream/assets/lib/Caption.tsx +54 -0
  161. package/lib/motion/shotcraft/upstream/assets/lib/ClipCard.tsx +200 -0
  162. package/lib/motion/shotcraft/upstream/assets/lib/DigitRoll.tsx +45 -0
  163. package/lib/motion/shotcraft/upstream/assets/lib/FlashCut.tsx +20 -0
  164. package/lib/motion/shotcraft/upstream/assets/lib/FlatPanel.tsx +65 -0
  165. package/lib/motion/shotcraft/upstream/assets/lib/PageCam.tsx +151 -0
  166. package/lib/motion/shotcraft/upstream/assets/lib/VerticalTicker.tsx +129 -0
  167. package/lib/motion/shotcraft/upstream/assets/lib/helpers/camera.tsx +75 -0
  168. package/lib/motion/shotcraft/upstream/assets/lib/helpers/motion.ts +40 -0
  169. package/lib/motion/shotcraft/upstream/assets/lib/helpers/rand.ts +11 -0
  170. package/lib/motion/shotcraft/upstream/assets/lib/helpers/shake.ts +10 -0
  171. package/lib/motion/shotcraft/upstream/assets/scripts/__pycache__/sfx-source.cpython-313.pyc +0 -0
  172. package/lib/motion/shotcraft/upstream/assets/scripts/build-readme-cover.mjs +49 -0
  173. package/lib/motion/shotcraft/upstream/assets/scripts/capture-template.mjs +210 -0
  174. package/lib/motion/shotcraft/upstream/assets/scripts/sfx-source.py +423 -0
  175. package/lib/motion/shotcraft/upstream/assets/scripts/smoke-render-demos.py +170 -0
  176. package/lib/motion/shotcraft/upstream/assets/scripts/test_sfx_source.py +157 -0
  177. package/lib/motion/shotcraft/upstream/demos/README.md +120 -0
  178. package/lib/motion/shotcraft/upstream/demos/_fixtures/Brand.tsx +112 -0
  179. package/lib/motion/shotcraft/upstream/demos/_fixtures/Fixtures.tsx +647 -0
  180. package/lib/motion/shotcraft/upstream/demos/_fixtures/Look.tsx +316 -0
  181. package/lib/motion/shotcraft/upstream/demos/_fixtures/Motion.tsx +82 -0
  182. package/lib/motion/shotcraft/upstream/demos/_fixtures/PageCam2D.tsx +115 -0
  183. package/lib/motion/shotcraft/upstream/demos/_fixtures/Polish.tsx +243 -0
  184. package/lib/motion/shotcraft/upstream/demos/_textures/live-layout.json +389 -0
  185. package/lib/motion/shotcraft/upstream/demos/camera/basic-3d-scene/Basic3DScene.tsx +250 -0
  186. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashImpactReal.tsx +305 -0
  187. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashZoomReal.tsx +246 -0
  188. package/lib/motion/shotcraft/upstream/demos/camera/cursor-flyover/CursorFlyover.tsx +390 -0
  189. package/lib/motion/shotcraft/upstream/demos/camera/depth-layer-moves/MultiplaneReal.tsx +138 -0
  190. package/lib/motion/shotcraft/upstream/demos/camera/graze-face-tour/GrazeFaceTour.tsx +542 -0
  191. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/OverheadTabletopDrop.tsx +315 -0
  192. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/TiltReveal.tsx +299 -0
  193. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/DroneDiveLanding.tsx +173 -0
  194. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/ExplodedView.tsx +348 -0
  195. package/lib/motion/shotcraft/upstream/demos/camera/steep-tilt-glide/SteepTiltGlide.tsx +366 -0
  196. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx +279 -0
  197. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/PullBackIsolation.tsx +184 -0
  198. package/lib/motion/shotcraft/upstream/demos/camera/terminal-3d/Terminal3D.tsx +390 -0
  199. package/lib/motion/shotcraft/upstream/demos/data/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +155 -0
  200. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/AxisRescaleShockV2.tsx +303 -0
  201. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/OscilloscopeStreamV2.tsx +290 -0
  202. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/UnitDotSwarmRegroupV2.tsx +278 -0
  203. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/NeedleSweepSelftest.tsx +307 -0
  204. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/TapeScrollFixedPointer.tsx +215 -0
  205. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/BrakeReticleLock.tsx +299 -0
  206. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/ChangelogScrollBrake.tsx +232 -0
  207. package/lib/motion/shotcraft/upstream/demos/data/timeline-travel/TimelineTravel.tsx +290 -0
  208. package/lib/motion/shotcraft/upstream/demos/effects/assemble-then-type-flyin/AssembleThenTypeFlyin.tsx +273 -0
  209. package/lib/motion/shotcraft/upstream/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx +167 -0
  210. package/lib/motion/shotcraft/upstream/demos/effects/brand-frame-snap/BrandFrameSnap.tsx +536 -0
  211. package/lib/motion/shotcraft/upstream/demos/effects/fui-hud-moves/ReticleLockOn.tsx +164 -0
  212. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/FlylineArc.tsx +175 -0
  213. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/GlowOrbAmbient.tsx +197 -0
  214. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/OrbFlylineRelay.tsx +241 -0
  215. package/lib/motion/shotcraft/upstream/demos/effects/icon-performance-moves/AttentionBounce.tsx +279 -0
  216. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/AnimeImpact.tsx +230 -0
  217. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/HitCounter.tsx +345 -0
  218. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SheenSweepRetry.tsx +275 -0
  219. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SpotlightSweepReveal.tsx +229 -0
  220. package/lib/motion/shotcraft/upstream/demos/effects/radial-ripple-phone-chips/RadialRipplePhoneChips.tsx +312 -0
  221. package/lib/motion/shotcraft/upstream/demos/effects/riso-print-hits/RisoMisregistrationHit.tsx +222 -0
  222. package/lib/motion/shotcraft/upstream/demos/effects/scan-bracket-sweep/ScanBracketSweep.tsx +295 -0
  223. package/lib/motion/shotcraft/upstream/demos/effects/scanline-annotate-focus/ScanlineAnnotateFocus.tsx +329 -0
  224. package/lib/motion/shotcraft/upstream/demos/effects/scanline-assemble-flyin/ScanlineAssembleFlyin.tsx +315 -0
  225. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ImpactBurstKit.tsx +264 -0
  226. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/KanadaPerspectiveSnap.tsx +260 -0
  227. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ScoreSlam.tsx +263 -0
  228. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/CornerSpotlightReveal.tsx +123 -0
  229. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +187 -0
  230. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/SlideSpotlightPan.tsx +175 -0
  231. package/lib/motion/shotcraft/upstream/demos/interaction/autolayout-gap-dial/AutolayoutGapDial.tsx +305 -0
  232. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/DiagramCascadeBuild.tsx +350 -0
  233. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +352 -0
  234. package/lib/motion/shotcraft/upstream/demos/interaction/chip-grid-single-select-blackout/ChipGridSingleSelectBlackout.tsx +218 -0
  235. package/lib/motion/shotcraft/upstream/demos/interaction/collab-cursor-moves/CursorCastEnsemble.tsx +297 -0
  236. package/lib/motion/shotcraft/upstream/demos/interaction/glass-pill-dictation-typing/GlassPillDictationTyping.tsx +157 -0
  237. package/lib/motion/shotcraft/upstream/demos/interaction/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +218 -0
  238. package/lib/motion/shotcraft/upstream/demos/interaction/picker-carousel-feature-cycle/PickerCarouselFeatureCycle.tsx +202 -0
  239. package/lib/motion/shotcraft/upstream/demos/interaction/segmented-thumb-hero/SegmentedThumbHero.tsx +265 -0
  240. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/PaletteThemeRipple.tsx +457 -0
  241. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/ThemeSweepToggle.tsx +446 -0
  242. package/lib/motion/shotcraft/upstream/demos/interaction/type-and-filter/TypeAndFilter.tsx +249 -0
  243. package/lib/motion/shotcraft/upstream/demos/interaction/voice-waveform-live/VoiceWaveformLive.tsx +278 -0
  244. package/lib/motion/shotcraft/upstream/demos/opening/crane-rise-reveal/CraneRiseReveal.tsx +332 -0
  245. package/lib/motion/shotcraft/upstream/demos/opening/dataviz-landscape-open/DatavizLandscapeOpen.tsx +358 -0
  246. package/lib/motion/shotcraft/upstream/demos/opening/fracture/Fracture.tsx +201 -0
  247. package/lib/motion/shotcraft/upstream/demos/opening/icon-field-colorize/IconFieldColorize.tsx +200 -0
  248. package/lib/motion/shotcraft/upstream/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx +208 -0
  249. package/lib/motion/shotcraft/upstream/demos/opening/magician-card-flourish/MagicianCardFlourish.tsx +341 -0
  250. package/lib/motion/shotcraft/upstream/demos/opening/orbit-ring-title-open/OrbitRingTitleOpen.tsx +389 -0
  251. package/lib/motion/shotcraft/upstream/demos/opening/spotlight-hero-card/SpotlightHeroCard.tsx +293 -0
  252. package/lib/motion/shotcraft/upstream/demos/opening/stroke-segment-build/StrokeSegmentBuild.tsx +183 -0
  253. package/lib/motion/shotcraft/upstream/demos/opening/text-as-mask/TextAsMask.tsx +245 -0
  254. package/lib/motion/shotcraft/upstream/demos/outro/grain-dissolve/GrainDissolve.tsx +222 -0
  255. package/lib/motion/shotcraft/upstream/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx +223 -0
  256. package/lib/motion/shotcraft/upstream/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx +217 -0
  257. package/lib/motion/shotcraft/upstream/demos/outro/outro-group-photo-launch/OutroGroupPhotoLaunch.tsx +343 -0
  258. package/lib/motion/shotcraft/upstream/demos/outro/ui-strip-away-outro/UiStripAwayOutro.tsx +357 -0
  259. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/IconFlipBloomLogo.tsx +187 -0
  260. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/InputMorphsIntoLogo.tsx +333 -0
  261. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-cut-moves/PaparazziFlash.tsx +274 -0
  262. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +270 -0
  263. package/lib/motion/shotcraft/upstream/demos/rhythm/panel-grid-moves/ComicPanelSplit.tsx +430 -0
  264. package/lib/motion/shotcraft/upstream/demos/rhythm/quad-split-parallel-scenes/QuadSplitParallelScenes.tsx +252 -0
  265. package/lib/motion/shotcraft/upstream/demos/rhythm/rhythm-interrupt-moves/JumpCutPunchIn.tsx +106 -0
  266. package/lib/motion/shotcraft/upstream/demos/rhythm/sakuga-timing-shift/SakugaTimingShift.tsx +288 -0
  267. package/lib/motion/shotcraft/upstream/demos/rhythm/speed-ramp-freeze/FreezeAnnotateReal.tsx +362 -0
  268. package/lib/motion/shotcraft/upstream/demos/rhythm/trailer-grammar-moves/TrailerBumper.tsx +168 -0
  269. package/lib/motion/shotcraft/upstream/demos/transition/bottom-push-stack-wipe/BottomPushStackWipe.tsx +310 -0
  270. package/lib/motion/shotcraft/upstream/demos/transition/card-flip-reveal/CardFlipReveal.tsx +261 -0
  271. package/lib/motion/shotcraft/upstream/demos/transition/card-flock-tumble/CardFlockTumble.tsx +459 -0
  272. package/lib/motion/shotcraft/upstream/demos/transition/circle-match-iris/CircleMatchIris.tsx +294 -0
  273. package/lib/motion/shotcraft/upstream/demos/transition/gradient-transition/GradientTransition.tsx +161 -0
  274. package/lib/motion/shotcraft/upstream/demos/transition/line-carry-transition/LineCarryTransition.tsx +248 -0
  275. package/lib/motion/shotcraft/upstream/demos/transition/mosaic-reframe/MosaicReframe.tsx +359 -0
  276. package/lib/motion/shotcraft/upstream/demos/transition/page-turn-transitions/BarnDoorSplit.tsx +227 -0
  277. package/lib/motion/shotcraft/upstream/demos/transition/print-texture-transitions/InkBleedReveal.tsx +162 -0
  278. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/PortalWipeV2.tsx +248 -0
  279. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/WhipBrakeReal.tsx +186 -0
  280. package/lib/motion/shotcraft/upstream/demos/transition/tear-streak-transitions/GlitchDisplace.tsx +355 -0
  281. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/InvisibleCut.tsx +272 -0
  282. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/LightLeakBurn.tsx +262 -0
  283. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/VersusSlam.tsx +217 -0
  284. package/lib/motion/shotcraft/upstream/demos/transition/transition-travel/LetterformZoom.tsx +285 -0
  285. package/lib/motion/shotcraft/upstream/demos/transition/white-flash-logo-simplify-cut/WhiteFlashLogoSimplifyCut.tsx +205 -0
  286. package/lib/motion/shotcraft/upstream/demos/transition/wipe-transitions/BlindsSlice.tsx +178 -0
  287. package/lib/motion/shotcraft/upstream/demos/typography/blur-slide/BlurSlide.tsx +147 -0
  288. package/lib/motion/shotcraft/upstream/demos/typography/brace-expand/BraceExpand.tsx +143 -0
  289. package/lib/motion/shotcraft/upstream/demos/typography/brand-ink-open/BrandInkOpen.tsx +134 -0
  290. package/lib/motion/shotcraft/upstream/demos/typography/countdown-arc-scatter/CountdownArcScatter.tsx +217 -0
  291. package/lib/motion/shotcraft/upstream/demos/typography/flying-words/FlyingWords.tsx +198 -0
  292. package/lib/motion/shotcraft/upstream/demos/typography/glitch-cycle/GlitchCycle.tsx +221 -0
  293. package/lib/motion/shotcraft/upstream/demos/typography/gradient-word-sweep/GradientWordSweep.tsx +312 -0
  294. package/lib/motion/shotcraft/upstream/demos/typography/lead-word-zoom-assemble/LeadWordZoomAssemble.tsx +261 -0
  295. package/lib/motion/shotcraft/upstream/demos/typography/marker-underline-title/MarkerUnderlineTitle.tsx +121 -0
  296. package/lib/motion/shotcraft/upstream/demos/typography/outline-word-fill/OutlineWordFill.tsx +153 -0
  297. package/lib/motion/shotcraft/upstream/demos/typography/paper-title-card/PaperTitleCard.tsx +179 -0
  298. package/lib/motion/shotcraft/upstream/demos/typography/pill-chip-slot-cycle-handled/PillChipSlotCycleHandled.tsx +140 -0
  299. package/lib/motion/shotcraft/upstream/demos/typography/pill-slot-cycle/PillSlotCycle.tsx +309 -0
  300. package/lib/motion/shotcraft/upstream/demos/typography/text-column-converge/TextColumnConverge.tsx +191 -0
  301. package/lib/motion/shotcraft/upstream/demos/typography/title-demote-to-label/TitleDemoteToLabel.tsx +292 -0
  302. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/LetterformDriftAssembly.tsx +135 -0
  303. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/SplitTextStagger.tsx +124 -0
  304. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/TextOnPath.tsx +255 -0
  305. package/lib/motion/shotcraft/upstream/demos/typography/type-entrance-moves/LetterDropPhysics.tsx +173 -0
  306. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/FontWeightPump.tsx +225 -0
  307. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/KaraokeFillSync.tsx +141 -0
  308. package/lib/motion/shotcraft/upstream/demos/typography/typewriter-moves/TypewriterErrorRetype.tsx +137 -0
  309. package/lib/motion/shotcraft/upstream/demos/typography/vertical-word-roll-blur-cycle/VerticalWordRollBlurCycle.tsx +147 -0
  310. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-filmstrip/WordRelayFilmstrip.tsx +409 -0
  311. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-geometry/WordRelayGeometry.tsx +280 -0
  312. package/lib/motion/shotcraft/upstream/demos/ui-entrance/avatar-bracket-carousel/AvatarBracketCarousel.tsx +271 -0
  313. package/lib/motion/shotcraft/upstream/demos/ui-entrance/bezier-source-converge-merge/BezierSourceConvergeMerge.tsx +385 -0
  314. package/lib/motion/shotcraft/upstream/demos/ui-entrance/card-stack/CardStack.tsx +312 -0
  315. package/lib/motion/shotcraft/upstream/demos/ui-entrance/carousel-3d/Carousel3D.tsx +303 -0
  316. package/lib/motion/shotcraft/upstream/demos/ui-entrance/clipcard-looping/ClipCardLooping.tsx +77 -0
  317. package/lib/motion/shotcraft/upstream/demos/ui-entrance/cloner-depth-echo/ClonerDepthEcho.tsx +311 -0
  318. package/lib/motion/shotcraft/upstream/demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx +307 -0
  319. package/lib/motion/shotcraft/upstream/demos/ui-entrance/doc-park-left-pill-deal/DocParkLeftPillDeal.tsx +349 -0
  320. package/lib/motion/shotcraft/upstream/demos/ui-entrance/document-typewriter-reveal/DocumentTypewriterReveal.tsx +255 -0
  321. package/lib/motion/shotcraft/upstream/demos/ui-entrance/draw-svg-trace/DrawSvgTrace.tsx +244 -0
  322. package/lib/motion/shotcraft/upstream/demos/ui-entrance/element-body-moves/ContactShadowLift.tsx +217 -0
  323. package/lib/motion/shotcraft/upstream/demos/ui-entrance/integration-hub-map/IntegrationHubMap.tsx +652 -0
  324. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-reveal/ListReveal.tsx +153 -0
  325. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-stack-press/ListStackPress.tsx +238 -0
  326. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-forerun/NeonFrameForerun.tsx +324 -0
  327. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +354 -0
  328. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/PageWaterfallWall.tsx +101 -0
  329. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/VerticalTicker.tsx +129 -0
  330. package/lib/motion/shotcraft/upstream/demos/ui-entrance/product-card-progressive-assemble/ProductCardProgressiveAssemble.tsx +297 -0
  331. package/lib/motion/shotcraft/upstream/demos/ui-entrance/radial-wave/RadialWave.tsx +57 -0
  332. package/lib/motion/shotcraft/upstream/demos/ui-entrance/research-card-stack-scroll/ResearchCardStackScroll.tsx +155 -0
  333. package/lib/motion/shotcraft/upstream/demos/ui-entrance/row-embed/RowEmbed.tsx +175 -0
  334. package/lib/motion/shotcraft/upstream/demos/ui-entrance/value-stagger-gradient/ValueStaggerGradient.tsx +153 -0
  335. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/BentoLightUp.tsx +146 -0
  336. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/WireframeDrawOn.tsx +226 -0
  337. package/lib/motion/shotcraft/upstream/gallery/api/library.json +1 -0
  338. package/lib/motion/shotcraft/upstream/manifest.json +2715 -0
  339. package/lib/motion/shotcraft/upstream/references/aesthetic-rules.md +193 -0
  340. package/lib/motion/shotcraft/upstream/references/final-review.md +121 -0
  341. package/lib/motion/shotcraft/upstream/references/guided-free-creation.md +199 -0
  342. package/lib/motion/shotcraft/upstream/references/jianying-export.md +183 -0
  343. package/lib/motion/shotcraft/upstream/references/music-beat-sync.md +257 -0
  344. package/lib/motion/shotcraft/upstream/references/pipeline.md +382 -0
  345. package/lib/motion/shotcraft/upstream/references/publish-upload-post.md +111 -0
  346. package/lib/motion/shotcraft/upstream/references/sequences/promo-energy-arc.md +50 -0
  347. package/lib/motion/shotcraft/upstream/references/sfx-sourcing.md +95 -0
  348. package/lib/motion/shotcraft/upstream/references/shots/camera/basic-3d-scene.md +41 -0
  349. package/lib/motion/shotcraft/upstream/references/shots/camera/crash-zoom-punch.md +52 -0
  350. package/lib/motion/shotcraft/upstream/references/shots/camera/cursor-flyover.md +39 -0
  351. package/lib/motion/shotcraft/upstream/references/shots/camera/depth-layer-moves.md +39 -0
  352. package/lib/motion/shotcraft/upstream/references/shots/camera/graze-face-tour.md +57 -0
  353. package/lib/motion/shotcraft/upstream/references/shots/camera/overhead-camera-moves.md +51 -0
  354. package/lib/motion/shotcraft/upstream/references/shots/camera/space-camera-moves.md +46 -0
  355. package/lib/motion/shotcraft/upstream/references/shots/camera/steep-tilt-glide.md +52 -0
  356. package/lib/motion/shotcraft/upstream/references/shots/camera/tension-camera-moves.md +43 -0
  357. package/lib/motion/shotcraft/upstream/references/shots/camera/terminal-3d.md +42 -0
  358. package/lib/motion/shotcraft/upstream/references/shots/data/before-after-slider-scrub.md +48 -0
  359. package/lib/motion/shotcraft/upstream/references/shots/data/chart-live-moves.md +52 -0
  360. package/lib/motion/shotcraft/upstream/references/shots/data/gauge-readout-moves.md +45 -0
  361. package/lib/motion/shotcraft/upstream/references/shots/data/scroll-brake-moves.md +46 -0
  362. package/lib/motion/shotcraft/upstream/references/shots/data/timeline-travel.md +44 -0
  363. package/lib/motion/shotcraft/upstream/references/shots/effects/assemble-then-type-flyin.md +63 -0
  364. package/lib/motion/shotcraft/upstream/references/shots/effects/aurora-bloom-bg-flip.md +54 -0
  365. package/lib/motion/shotcraft/upstream/references/shots/effects/brand-frame-snap.md +58 -0
  366. package/lib/motion/shotcraft/upstream/references/shots/effects/fui-hud-moves.md +35 -0
  367. package/lib/motion/shotcraft/upstream/references/shots/effects/glow-flyline-moves.md +53 -0
  368. package/lib/motion/shotcraft/upstream/references/shots/effects/icon-performance-moves.md +42 -0
  369. package/lib/motion/shotcraft/upstream/references/shots/effects/impact-feedback.md +50 -0
  370. package/lib/motion/shotcraft/upstream/references/shots/effects/light-play-moves.md +46 -0
  371. package/lib/motion/shotcraft/upstream/references/shots/effects/radial-ripple-phone-chips.md +56 -0
  372. package/lib/motion/shotcraft/upstream/references/shots/effects/riso-print-hits.md +49 -0
  373. package/lib/motion/shotcraft/upstream/references/shots/effects/scan-bracket-sweep.md +50 -0
  374. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-annotate-focus.md +53 -0
  375. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-assemble-flyin.md +53 -0
  376. package/lib/motion/shotcraft/upstream/references/shots/effects/slam-entrance-moves.md +55 -0
  377. package/lib/motion/shotcraft/upstream/references/shots/effects/spotlight-sweep-moves.md +52 -0
  378. package/lib/motion/shotcraft/upstream/references/shots/interaction/autolayout-gap-dial.md +60 -0
  379. package/lib/motion/shotcraft/upstream/references/shots/interaction/canvas-materialize-moves.md +57 -0
  380. package/lib/motion/shotcraft/upstream/references/shots/interaction/chip-grid-single-select-blackout.md +51 -0
  381. package/lib/motion/shotcraft/upstream/references/shots/interaction/collab-cursor-moves.md +41 -0
  382. package/lib/motion/shotcraft/upstream/references/shots/interaction/glass-pill-dictation-typing.md +53 -0
  383. package/lib/motion/shotcraft/upstream/references/shots/interaction/hashtag-to-pill-materialize.md +60 -0
  384. package/lib/motion/shotcraft/upstream/references/shots/interaction/picker-carousel-feature-cycle.md +55 -0
  385. package/lib/motion/shotcraft/upstream/references/shots/interaction/segmented-thumb-hero.md +57 -0
  386. package/lib/motion/shotcraft/upstream/references/shots/interaction/theme-switch-moves.md +47 -0
  387. package/lib/motion/shotcraft/upstream/references/shots/interaction/type-and-filter.md +37 -0
  388. package/lib/motion/shotcraft/upstream/references/shots/interaction/voice-waveform-live.md +54 -0
  389. package/lib/motion/shotcraft/upstream/references/shots/opening/brand-ink-open.md +36 -0
  390. package/lib/motion/shotcraft/upstream/references/shots/opening/crane-rise-reveal.md +56 -0
  391. package/lib/motion/shotcraft/upstream/references/shots/opening/dataviz-landscape-open.md +56 -0
  392. package/lib/motion/shotcraft/upstream/references/shots/opening/fracture.md +40 -0
  393. package/lib/motion/shotcraft/upstream/references/shots/opening/icon-field-colorize.md +60 -0
  394. package/lib/motion/shotcraft/upstream/references/shots/opening/letterspace-materialize.md +57 -0
  395. package/lib/motion/shotcraft/upstream/references/shots/opening/magician-card-flourish.md +73 -0
  396. package/lib/motion/shotcraft/upstream/references/shots/opening/orbit-ring-title-open.md +87 -0
  397. package/lib/motion/shotcraft/upstream/references/shots/opening/spotlight-hero-card.md +55 -0
  398. package/lib/motion/shotcraft/upstream/references/shots/opening/stroke-segment-build.md +50 -0
  399. package/lib/motion/shotcraft/upstream/references/shots/opening/text-as-mask.md +59 -0
  400. package/lib/motion/shotcraft/upstream/references/shots/outro/grain-dissolve.md +38 -0
  401. package/lib/motion/shotcraft/upstream/references/shots/outro/logo-shrink-wordmark-lockup.md +38 -0
  402. package/lib/motion/shotcraft/upstream/references/shots/outro/neon-triple-marquee.md +59 -0
  403. package/lib/motion/shotcraft/upstream/references/shots/outro/outro-group-photo-launch.md +39 -0
  404. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-strip-away-outro.md +61 -0
  405. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-to-brand-morph.md +52 -0
  406. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-cut-moves.md +50 -0
  407. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-step-list-theme-cycle.md +66 -0
  408. package/lib/motion/shotcraft/upstream/references/shots/rhythm/panel-grid-moves.md +43 -0
  409. package/lib/motion/shotcraft/upstream/references/shots/rhythm/quad-split-parallel-scenes.md +38 -0
  410. package/lib/motion/shotcraft/upstream/references/shots/rhythm/rhythm-interrupt-moves.md +38 -0
  411. package/lib/motion/shotcraft/upstream/references/shots/rhythm/sakuga-timing-shift.md +56 -0
  412. package/lib/motion/shotcraft/upstream/references/shots/rhythm/speed-ramp-freeze.md +44 -0
  413. package/lib/motion/shotcraft/upstream/references/shots/rhythm/trailer-grammar-moves.md +38 -0
  414. package/lib/motion/shotcraft/upstream/references/shots/transition/bottom-push-stack-wipe.md +63 -0
  415. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flip-reveal.md +57 -0
  416. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flock-tumble.md +63 -0
  417. package/lib/motion/shotcraft/upstream/references/shots/transition/circle-match-iris.md +58 -0
  418. package/lib/motion/shotcraft/upstream/references/shots/transition/gradient-transition.md +45 -0
  419. package/lib/motion/shotcraft/upstream/references/shots/transition/line-carry-transition.md +55 -0
  420. package/lib/motion/shotcraft/upstream/references/shots/transition/mosaic-reframe.md +49 -0
  421. package/lib/motion/shotcraft/upstream/references/shots/transition/page-turn-transitions.md +42 -0
  422. package/lib/motion/shotcraft/upstream/references/shots/transition/print-texture-transitions.md +42 -0
  423. package/lib/motion/shotcraft/upstream/references/shots/transition/shot-transitions.md +45 -0
  424. package/lib/motion/shotcraft/upstream/references/shots/transition/tear-streak-transitions.md +48 -0
  425. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-hidden-cut.md +55 -0
  426. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-travel.md +43 -0
  427. package/lib/motion/shotcraft/upstream/references/shots/transition/white-flash-logo-simplify-cut.md +41 -0
  428. package/lib/motion/shotcraft/upstream/references/shots/transition/wipe-transitions.md +42 -0
  429. package/lib/motion/shotcraft/upstream/references/shots/typography/blur-slide.md +59 -0
  430. package/lib/motion/shotcraft/upstream/references/shots/typography/brace-expand.md +55 -0
  431. package/lib/motion/shotcraft/upstream/references/shots/typography/countdown-arc-scatter.md +65 -0
  432. package/lib/motion/shotcraft/upstream/references/shots/typography/document-typewriter-reveal.md +42 -0
  433. package/lib/motion/shotcraft/upstream/references/shots/typography/flying-words.md +64 -0
  434. package/lib/motion/shotcraft/upstream/references/shots/typography/glitch-cycle.md +64 -0
  435. package/lib/motion/shotcraft/upstream/references/shots/typography/gradient-word-sweep.md +54 -0
  436. package/lib/motion/shotcraft/upstream/references/shots/typography/lead-word-zoom-assemble.md +91 -0
  437. package/lib/motion/shotcraft/upstream/references/shots/typography/marker-underline-title.md +51 -0
  438. package/lib/motion/shotcraft/upstream/references/shots/typography/outline-word-fill.md +66 -0
  439. package/lib/motion/shotcraft/upstream/references/shots/typography/paper-title-card.md +38 -0
  440. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-chip-slot-cycle-handled.md +66 -0
  441. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-slot-cycle.md +58 -0
  442. package/lib/motion/shotcraft/upstream/references/shots/typography/text-column-converge.md +61 -0
  443. package/lib/motion/shotcraft/upstream/references/shots/typography/title-demote-to-label.md +64 -0
  444. package/lib/motion/shotcraft/upstream/references/shots/typography/type-assembly-moves.md +45 -0
  445. package/lib/motion/shotcraft/upstream/references/shots/typography/type-entrance-moves.md +41 -0
  446. package/lib/motion/shotcraft/upstream/references/shots/typography/type-rhythm-sync.md +51 -0
  447. package/lib/motion/shotcraft/upstream/references/shots/typography/typewriter-moves.md +42 -0
  448. package/lib/motion/shotcraft/upstream/references/shots/typography/vertical-word-roll-blur-cycle.md +63 -0
  449. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-filmstrip.md +57 -0
  450. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-geometry.md +75 -0
  451. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/avatar-bracket-carousel.md +59 -0
  452. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/bezier-source-converge-merge.md +67 -0
  453. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/card-stack.md +60 -0
  454. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/carousel-3d.md +66 -0
  455. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/cloner-depth-echo.md +40 -0
  456. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/deck-deal-flyin.md +45 -0
  457. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/doc-park-left-pill-deal.md +62 -0
  458. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/draw-svg-trace.md +55 -0
  459. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/element-body-moves.md +37 -0
  460. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/integration-hub-map.md +55 -0
  461. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-reveal.md +50 -0
  462. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-stack-press.md +43 -0
  463. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-forerun.md +55 -0
  464. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-orbit-drop.md +51 -0
  465. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/page-waterfall-wall.md +51 -0
  466. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/product-card-progressive-assemble.md +56 -0
  467. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/radial-wave.md +49 -0
  468. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/research-card-stack-scroll.md +57 -0
  469. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/row-embed.md +36 -0
  470. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/value-stagger-gradient.md +64 -0
  471. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/wall-reveal-moves.md +47 -0
  472. package/lib/motion/shotcraft/upstream/references/sound-design.md +170 -0
  473. package/lib/motion/shotcraft/upstream/references/workbench.md +157 -0
  474. package/lib/motion/shotcraft/upstream/template/TEMPLATE.md +103 -0
  475. package/lib/motion/shotcraft/upstream/template/THEMES.md +44 -0
  476. package/lib/motion/shotcraft/upstream/template/package.json +20 -0
  477. package/lib/motion/shotcraft/upstream/template/remotion.config.ts +6 -0
  478. package/lib/motion/shotcraft/upstream/template/src/Root.tsx +17 -0
  479. package/lib/motion/shotcraft/upstream/template/src/aifl/Caption.tsx +65 -0
  480. package/lib/motion/shotcraft/upstream/template/src/aifl/DigitRoll.tsx +48 -0
  481. package/lib/motion/shotcraft/upstream/template/src/aifl/FlashCut.tsx +24 -0
  482. package/lib/motion/shotcraft/upstream/template/src/aifl/Main.tsx +192 -0
  483. package/lib/motion/shotcraft/upstream/template/src/aifl/PaperTitleCard.tsx +111 -0
  484. package/lib/motion/shotcraft/upstream/template/src/aifl/live/PageCam.tsx +150 -0
  485. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneDetail.tsx +158 -0
  486. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneFlyIn.tsx +468 -0
  487. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOpen.tsx +552 -0
  488. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOutroLive.tsx +411 -0
  489. package/lib/motion/shotcraft/upstream/template/src/aifl/live/ScenePapers.tsx +200 -0
  490. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneWbr.tsx +324 -0
  491. package/lib/motion/shotcraft/upstream/template/src/aifl/live-layout.json +389 -0
  492. package/lib/motion/shotcraft/upstream/template/src/index.ts +4 -0
  493. package/lib/motion/shotcraft/upstream/template/src/themes/ThemedFilm.tsx +7 -0
  494. package/lib/motion/shotcraft/upstream/template/src/themes/manifest.tsx +68 -0
  495. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.json +1 -0
  496. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.ts +24 -0
  497. package/lib/motion/shotcraft/upstream/template/src/themes/palettes.json +74 -0
  498. package/lib/motion/shotcraft/upstream/template/src/themes/visual-theme.tsx +91 -0
  499. package/lib/motion/shotcraft/upstream/template/src/workbench.ts +213 -0
  500. package/lib/motion/shotcraft/upstream/template/tsconfig.json +15 -0
  501. package/lib/motion/spec.js +113 -0
  502. package/lib/motion/style-engine.js +153 -0
  503. package/lib/motion/style-frames.js +268 -0
  504. package/lib/motion/sync.js +214 -0
  505. package/lib/motion/theme.js +121 -0
  506. package/lib/motion/voice.js +417 -0
  507. package/lib/motion-agent-files.js +82 -0
  508. package/lib/motion-agent-protocol.js +66 -0
  509. package/lib/motion-agent-tools.js +196 -0
  510. package/lib/motion-agent.js +171 -0
  511. package/lib/motion-capture.js +92 -0
  512. package/lib/motion-core.js +238 -0
  513. package/lib/motion-film-review.js +71 -0
  514. package/lib/motion-library.js +210 -0
  515. package/lib/motion-planner.js +254 -0
  516. package/lib/motion-project.js +80 -0
  517. package/lib/motion-render-worker.js +145 -0
  518. package/lib/motion-session.js +32 -0
  519. package/lib/motion-source.js +49 -0
  520. package/lib/motion-tasks.js +452 -0
  521. package/lib/motion-vision.js +43 -0
  522. package/lib/mxfile.js +27 -7
  523. package/lib/routing/node-runtime.js +14 -0
  524. package/lib/routing/router.js +211 -0
  525. package/lib/routing/vendor/README.md +96 -0
  526. package/lib/routing/vendor/libavoid-routing.js +753 -0
  527. package/lib/routing/vendor/libavoid.min.js +59 -0
  528. package/lib/shotcard-core.js +39 -0
  529. package/lib/shotcard-reference.js +56 -0
  530. package/lib/style-kernel.js +37 -3
  531. package/lib/task-patches.js +26 -2
  532. package/lib/video-export.js +17 -2
  533. package/package.json +29 -4
@@ -0,0 +1,426 @@
1
+ /* 由 tools/build.mjs 生成 —— 请勿直接编辑;改 src/ 下的源文件。 */
2
+ /**
3
+ * ComfyUI 工作流「UI 格式 → API 格式」转换。
4
+ *
5
+ * 为什么需要它:ComfyUI 前端「保存 / 导出」默认写的是 UI 格式(节点摆在画布上的样子,
6
+ * 带 links / widgets_values / definitions.subgraphs),而 `POST /prompt` 只认 API 格式
7
+ * (`{ nodeId: { class_type, inputs } }`)。用户从 ComfyUI 拿到的模板天然是前者。
8
+ *
9
+ * 这个模块只做纯数据变换,不碰网络也不碰文件:
10
+ * flattenWorkflow(ui) → 展开子图后的节点表 / 连线表
11
+ * convertToApi(ui, objectInfo, opt) → { prompt, roles, warnings }
12
+ *
13
+ * 三条关键语义(对着 ComfyUI 0.38 / 前端 1.53 的真实数据验过):
14
+ * 1. 子图(definitions.subgraphs)必须内联:节点 id 加 `子图节点id:` 前缀,
15
+ * 子图输入(origin_id = -10 / origin_slot = k)换成外层来源或子图节点上的 widget 常量,
16
+ * 子图输出(target_id = -20)换成内部真实来源。
17
+ * 2. `ComfySwitchNode` 是 lazy 开关:按 switch 的值只保留被选中的那一支,
18
+ * 另一支(例如 Qwen 的 TextGenerate 改写链、9B PE 模型)整支剪掉 —— 不然后端会白白加载模型。
19
+ * 3. widget 值的消费顺序必须按 object_info 的 required → optional 顺序逐项走,
20
+ * 并为 `control_after_generate`(KSampler.seed 后面那个 "fixed"/"randomize")与
21
+ * `COMFY_DYNAMICCOMBO_V3`(SaveImageAdvanced.format、TextGenerate.sampling_mode)留下的
22
+ * 隐藏 widget 各让出一格,否则后面所有参数整体错一位。
23
+ */
24
+
25
+ /** 这些 class_type 在 UI 里只是「显示用」的节点,不进 API prompt(也不需要问 /object_info)。 */
26
+ export const FRONTEND_ONLY = new Set(['MarkdownNote', 'Note', 'Reroute', 'PrimitiveNode'])
27
+
28
+ /** 视为「出图终点」的节点 —— 从它们反向遍历决定哪些节点真的需要留。 */
29
+ const SINK_TYPES = new Set(['SaveImage', 'SaveImageAdvanced', 'PreviewImage'])
30
+
31
+ /** 子图输入里哪些类型会变成 widget(其余是连线型输入,如 IMAGE / LATENT)。 */
32
+ function isWidgetType(type) {
33
+ if (Array.isArray(type)) return true
34
+ const t = String(type)
35
+ return t === 'INT' || t === 'FLOAT' || t === 'STRING' || t === 'BOOLEAN' || t === 'COMBO'
36
+ }
37
+
38
+ function specType(spec) {
39
+ if (!Array.isArray(spec)) return typeof spec === 'string' ? spec : ''
40
+ if (Array.isArray(spec[0])) return 'COMBO'
41
+ return String(spec[0])
42
+ }
43
+
44
+ function isWidgetSpec(spec) {
45
+ if (!Array.isArray(spec)) return false
46
+ if (Array.isArray(spec[0])) return true
47
+ const t = String(spec[0])
48
+ return t === 'INT' || t === 'FLOAT' || t === 'STRING' || t === 'BOOLEAN' || t === 'COMBO' || t === 'COMFY_DYNAMICCOMBO_V3'
49
+ }
50
+
51
+ /** object_info 里一个 widget 实际占几格 widgets_values(动态 combo、随机种子会多占)。 */
52
+ function widgetSpan(spec) {
53
+ if (!isWidgetSpec(spec)) return 0
54
+ let span = 1
55
+ const opts = Array.isArray(spec) ? spec[1] || {} : {}
56
+ if (opts.control_after_generate === true) span += 1
57
+ if (specType(spec) === 'COMFY_DYNAMICCOMBO_V3') {
58
+ const first = (opts.options || [])[0]
59
+ const sub = first && first.inputs ? [...Object.keys(first.inputs.required || {}), ...Object.keys(first.inputs.optional || {})] : []
60
+ span += sub.length
61
+ }
62
+ return span
63
+ }
64
+
65
+ /**
66
+ * 把 UI 工作流(含任意层子图)摊平成一张节点表 + 一张连线表。
67
+ *
68
+ * 节点 key 是字符串(子图内部节点带 `外层id:` 前缀),这样 API prompt 里 id 稳定又唯一。
69
+ * 连线的 origin 有两种形态:`{ node, slot }`(连到某个节点输出)或 `{ const }`(字面量)。
70
+ */
71
+ export function flattenWorkflow(ui) {
72
+ const warnings = []
73
+ const nodes = new Map()
74
+ const links = new Map()
75
+ const subgraphs = new Map()
76
+ for (const sub of (ui.definitions && ui.definitions.subgraphs) || []) subgraphs.set(sub.id, sub)
77
+
78
+ /**
79
+ * @param {object} scope 当前层 { nodes, links }
80
+ * @param {string} prefix 当前层的 id 前缀
81
+ * @param {Array|null} outerInputs 子图输入槽 → 外层来源;顶层为 null
82
+ * @returns {Map<number, object>} 子图输出槽 → 内部来源
83
+ */
84
+ function expandScope(scope, prefix, outerInputs) {
85
+ const outputs = new Map()
86
+ const scopeLinks = scope.links || []
87
+
88
+ // 先登记连线:子图内部的 -10(输入)在这里就被换成外层来源或常量。
89
+ // 注意两种落盘形态并存:顶层 links 是数组 [id, origin_id, origin_slot, target_id, target_slot, type],
90
+ // 而 definitions.subgraphs[].links 是对象 { id, origin_id, origin_slot, target_id, target_slot, type }。
91
+ for (const raw of scopeLinks) {
92
+ const link = Array.isArray(raw)
93
+ ? { id: raw[0], originNode: raw[1], originSlot: raw[2], targetNode: raw[3], targetSlot: raw[4] }
94
+ : {
95
+ id: raw.id,
96
+ originNode: raw.origin_id !== undefined ? raw.origin_id : raw.originNode,
97
+ originSlot: raw.origin_slot !== undefined ? raw.origin_slot : raw.originSlot,
98
+ targetNode: raw.target_id !== undefined ? raw.target_id : raw.targetNode,
99
+ targetSlot: raw.target_slot !== undefined ? raw.target_slot : raw.targetSlot,
100
+ }
101
+ const key = prefix + link.id
102
+ let origin
103
+ if (outerInputs !== null && link.originNode === -10) {
104
+ origin = outerInputs[link.originSlot] || { const: undefined }
105
+ } else {
106
+ origin = { node: prefix + link.originNode, slot: link.originSlot }
107
+ }
108
+ links.set(key, { id: key, origin, target: null })
109
+ if (outerInputs !== null && link.targetNode === -20) {
110
+ outputs.set(link.targetSlot, origin)
111
+ } else {
112
+ links.get(key).target = { node: prefix + link.targetNode, slot: link.targetSlot }
113
+ }
114
+ }
115
+
116
+ // 再展开节点:子图节点递归进去,普通节点进节点表。
117
+ for (const node of scope.nodes || []) {
118
+ const id = prefix + node.id
119
+ const sub = subgraphs.get(node.type)
120
+ if (sub) {
121
+ // 子图节点有两种「输入顺序」:
122
+ // 1. 节点自己的 inputs 数组 —— 只列被提升成插槽的输入,外层连线里的 target_slot 指的是它;
123
+ // 2. definitions.subgraphs[].inputs —— 全部子图输入,内部 -10 连线的 slot 与 widgets_values 指的都是它。
124
+ // 两者顺序不同(例如 promote 后 steps 从第 5 个跑到第 4 个),必须按 name 对齐。
125
+ const defInputs = sub.inputs || []
126
+ const socketInputs = Array.isArray(node.inputs) ? node.inputs : []
127
+ const defIndexByName = new Map()
128
+ defInputs.forEach((input, index) => {
129
+ if (!defIndexByName.has(input.name)) defIndexByName.set(input.name, [])
130
+ defIndexByName.get(input.name).push(index)
131
+ })
132
+ const incomingByDefIndex = new Map()
133
+ for (const link of links.values()) {
134
+ if (!link.target || link.target.node !== id) continue
135
+ const socket = socketInputs[link.target.slot]
136
+ const candidates = socket ? defIndexByName.get(socket.name) : undefined
137
+ const defIndex = candidates && candidates.length > 0 ? candidates.shift() : link.target.slot
138
+ incomingByDefIndex.set(defIndex, link.origin)
139
+ }
140
+ // widgets_values 的顺序 = defInputs 顺序,只给 widget 类输入;被外层接线的那些在 widgets_values 里
141
+ // 同样占一格,所以无论有没有外层来源都要先吃格,否则后面的子图参数会整体错位。
142
+ const widgets = Array.isArray(node.widgets_values) ? node.widgets_values : []
143
+ let widgetIndex = 0
144
+ const outerForInner = defInputs.map((input, index) => {
145
+ const widget = isWidgetType(input && input.type)
146
+ let value
147
+ if (widget) {
148
+ value = widgetIndex < widgets.length ? { const: widgets[widgetIndex] } : { const: undefined }
149
+ widgetIndex += 1
150
+ }
151
+ if (incomingByDefIndex.has(index)) return incomingByDefIndex.get(index)
152
+ return widget ? value : undefined
153
+ })
154
+ const innerOutputs = expandScope(sub, id + ':', outerForInner)
155
+ // 外层引用「这个子图节点的第 k 个输出」的连线,改指向子图内部真实来源。
156
+ for (const link of links.values()) {
157
+ if (link.origin && link.origin.node === id) {
158
+ link.origin = innerOutputs.get(link.origin.slot) || { const: undefined }
159
+ }
160
+ }
161
+ continue
162
+ }
163
+ if (node.mode !== undefined && node.mode !== 0) {
164
+ warnings.push('节点 ' + id + '(' + node.type + ')处于 mode=' + node.mode + '(mute/bypass),已按停用处理')
165
+ }
166
+ nodes.set(id, {
167
+ id,
168
+ type: node.type,
169
+ mode: node.mode === undefined ? 0 : node.mode,
170
+ inputs: Array.isArray(node.inputs) ? node.inputs : [],
171
+ widgets: Array.isArray(node.widgets_values) ? node.widgets_values : [],
172
+ raw: node,
173
+ })
174
+ }
175
+ return outputs
176
+ }
177
+
178
+ expandScope({ nodes: ui.nodes, links: ui.links }, '', null)
179
+ return { nodes, links, warnings }
180
+ }
181
+
182
+ /** 把一条连线的 origin 变成 API prompt 里能直接写的形态。 */
183
+ function toRef(origin) {
184
+ if (!origin) return undefined
185
+ if ('const' in origin) return origin.const
186
+ return [origin.node, origin.slot]
187
+ }
188
+
189
+ /** 收集每个节点「输入槽 → 连线来源」,名字取节点自己 inputs 数组里的 name。 */
190
+ function collectIncoming(nodes, links) {
191
+ const incoming = new Map()
192
+ for (const link of links.values()) {
193
+ if (!link.target) continue
194
+ const node = nodes.get(link.target.node)
195
+ const entry = node ? node.inputs[link.target.slot] : undefined
196
+ if (!entry) continue
197
+ const byName = incoming.get(link.target.node) || new Map()
198
+ byName.set(entry.name, link.origin)
199
+ incoming.set(link.target.node, byName)
200
+ }
201
+ return incoming
202
+ }
203
+
204
+ /**
205
+ * UI 工作流 → API prompt。
206
+ *
207
+ * @param {object} ui ComfyUI 导出的 UI 格式工作流
208
+ * @param {Record<string, object>} objectInfo `/object_info` 的节点定义表(可以只给用到的类)
209
+ * @param {object} [options]
210
+ * @param {(node: object) => string} [options.classAlias] 换掉某个节点的 class_type(默认把 SaveImageAdvanced 换成内置 SaveImage,绕开动态 combo 编码)
211
+ * @param {boolean} [options.keepAll] true 时不做可达性剪枝
212
+ */
213
+ export function convertToApi(ui, objectInfo, options = {}) {
214
+ const warnings = []
215
+ const { nodes, links, warnings: flatWarnings } = flattenWorkflow(ui)
216
+ warnings.push(...flatWarnings)
217
+ const incoming = collectIncoming(nodes, links)
218
+
219
+ /** 按节点收集的警告:剪枝之后只报留下来的节点,避免「没被选中的改写链」在诊断里刷屏。 */
220
+ const nodeWarnings = new Map()
221
+ const warnNode = (id, message) => {
222
+ const list = nodeWarnings.get(id)
223
+ if (list === undefined) nodeWarnings.set(id, [message])
224
+ else list.push(message)
225
+ }
226
+
227
+ const classOf = (node) => {
228
+ if (node.type === 'SaveImageAdvanced') return 'SaveImage'
229
+ return node.type
230
+ }
231
+
232
+ /** 追一条 origin:穿过 PurePreview / 开关 / 字面量节点,直到落到真实节点输出或常量。 */
233
+ function resolveOrigin(origin, seen) {
234
+ if (!origin) return origin
235
+ if ('const' in origin) return origin
236
+ const key = origin.node + ':' + origin.slot
237
+ if (seen.has(key)) {
238
+ warnings.push('连线成环:' + key)
239
+ return origin
240
+ }
241
+ seen.add(key)
242
+ const node = nodes.get(origin.node)
243
+ if (!node) return origin
244
+ const byName = incoming.get(origin.node) || new Map()
245
+ if (node.type === 'ComfySwitchNode') {
246
+ const chosen = node.widgets[0] ? 'on_true' : 'on_false'
247
+ const next = byName.get(chosen)
248
+ if (next === undefined) {
249
+ warnings.push('开关 ' + origin.node + ' 的 ' + chosen + ' 没有连线')
250
+ return origin
251
+ }
252
+ return resolveOrigin(next, seen)
253
+ }
254
+ if (node.type === 'PreviewAny') {
255
+ const next = byName.get('source')
256
+ return next === undefined ? origin : resolveOrigin(next, seen)
257
+ }
258
+ if (/^Primitive/.test(node.type) && node.inputs.every((entry) => entry.link === null || entry.link === undefined)) {
259
+ return { const: node.widgets[0] }
260
+ }
261
+ return origin
262
+ }
263
+
264
+ // 第一步:按 object_info 的字段顺序把每个节点变成 { class_type, inputs }。
265
+ const prompt = {}
266
+ for (const node of nodes.values()) {
267
+ if (node.mode !== 0) continue
268
+ if (FRONTEND_ONLY.has(node.type)) continue
269
+ const classType = classOf(node)
270
+ const spec = objectInfo[classType] || objectInfo[node.type]
271
+ if (!spec || !spec.input) {
272
+ warnings.push('跳过节点 ' + node.id + '(' + node.type + '):/object_info 里没有这个类型(前端专用节点)')
273
+ continue
274
+ }
275
+ const byName = incoming.get(node.id) || new Map()
276
+ const required = (spec.input && spec.input.required) || {}
277
+ const optional = (spec.input && spec.input.optional) || {}
278
+ const ordered = [...Object.keys(required), ...Object.keys(optional)]
279
+ const inputs = {}
280
+ let widgetIndex = 0
281
+ for (const name of ordered) {
282
+ const inputSpec = required[name] !== undefined ? required[name] : optional[name]
283
+ const type = specType(inputSpec)
284
+
285
+ // 动态增长输入(COMFY_AUTOGROW_V3):UI 里是 `images.image_1` 这种子输入,API 里是一个对象。
286
+ if (type === 'COMFY_AUTOGROW_V3') {
287
+ const children = {}
288
+ for (const [entryName, origin] of byName) {
289
+ if (entryName !== name && !entryName.startsWith(name + '.')) continue
290
+ const childKey = entryName === name ? 'image_1' : entryName.slice(name.length + 1)
291
+ const ref = toRef(resolveOrigin(origin, new Set()))
292
+ if (ref !== undefined) children[childKey] = ref
293
+ }
294
+ if (Object.keys(children).length > 0) inputs[name] = children
295
+ continue
296
+ }
297
+
298
+ // widget 输入即使被提升成插槽接了线,widgets_values 里仍占一格(值是旧的),所以先按 span 吃格,
299
+ // 再看要不要用连线覆盖 —— 否则后面的 widget 会整体错一位(UNETLoader.weight_dtype、KSampler.denoise 都会错)。
300
+ const widget = isWidgetSpec(inputSpec)
301
+ let value
302
+ if (widget) {
303
+ value = node.widgets[widgetIndex]
304
+ widgetIndex += widgetSpan(inputSpec)
305
+ }
306
+
307
+ if (byName.has(name)) {
308
+ const ref = toRef(resolveOrigin(byName.get(name), new Set()))
309
+ if (ref !== undefined) inputs[name] = ref
310
+ continue
311
+ }
312
+
313
+ if (widget) {
314
+ inputs[name] = value
315
+ if (Array.isArray(inputSpec) && inputSpec[1] && inputSpec[1].options && specType(inputSpec) === 'COMFY_DYNAMICCOMBO_V3') {
316
+ const matched = (inputSpec[1].options || []).some((option) => option.key === value)
317
+ if (!matched) warnings.push('动态 combo ' + node.type + '.' + name + ' 的值 ' + JSON.stringify(value) + ' 不在可选项里')
318
+ }
319
+ continue
320
+ }
321
+
322
+ // 可选输入没连线是常态(TextEncodeQwenImage21 的 vae、ResolutionSelector 的 preview 预览、
323
+ // 自定义节点给前端留的预览口);只有必填输入缺了才值得让用户看见。
324
+ if (required[name] !== undefined) warnNode(node.id, '节点 ' + node.id + '(' + node.type + ')的输入 ' + name + ' 既没连线也不是 widget')
325
+ }
326
+ prompt[node.id] = { class_type: classType, inputs }
327
+ }
328
+
329
+ // 第二步:只保留从「出图终点」走得到的节点 —— 开关没选中的改写链、预览节点就此消失。
330
+ if (!options.keepAll) {
331
+ const sinks = Object.keys(prompt).filter((id) => SINK_TYPES.has(prompt[id].class_type))
332
+ if (sinks.length === 0) warnings.push('转换结果里没有任何出图节点(SaveImage / SaveImageAdvanced / PreviewImage)')
333
+ const keep = new Set()
334
+ const stack = [...sinks]
335
+ while (stack.length > 0) {
336
+ const id = stack.pop()
337
+ if (keep.has(id)) continue
338
+ keep.add(id)
339
+ const inputs = prompt[id].inputs
340
+ for (const value of Object.values(inputs)) {
341
+ if (Array.isArray(value) && typeof value[0] === 'string' && prompt[value[0]] !== undefined) stack.push(value[0])
342
+ else if (value && typeof value === 'object' && !Array.isArray(value)) {
343
+ for (const child of Object.values(value)) {
344
+ if (Array.isArray(child) && typeof child[0] === 'string' && prompt[child[0]] !== undefined) stack.push(child[0])
345
+ }
346
+ }
347
+ }
348
+ }
349
+ for (const id of Object.keys(prompt)) if (!keep.has(id)) delete prompt[id]
350
+ }
351
+
352
+ // 剪枝之后再报节点级警告:被开关剪掉的节点(例如 Qwen 的 TextGenerate 改写链)不该出现在诊断里。
353
+ for (const [id, list] of nodeWarnings) if (prompt[id] !== undefined) warnings.push(...list)
354
+
355
+ // 第三步:标出调用方真正要改的参数位置。
356
+ return { prompt, roles: detectRoles(prompt), warnings }
357
+ }
358
+
359
+ /**
360
+ * 标出调用方真正要改的参数位置(提示词 / 尺寸 / 采样 / 源图 / 输出前缀)。
361
+ *
362
+ * 转换流程在剪枝后调用它;用户直接给 API 格式工作流时也用它 —— 两条路径共用同一套角色判定,
363
+ * 这样「内置/自贴的工作流」与「用户自己粘贴的 API 工作流」在插件眼里没有区别。
364
+ */
365
+ export function detectRoles(prompt) {
366
+ const roles = { sources: [] }
367
+ for (const [id, node] of Object.entries(prompt)) {
368
+ const inputs = node.inputs || {}
369
+ if (node.class_type === 'TextEncodeQwenImage21' || node.class_type === 'CLIPTextEncode') {
370
+ if (roles.encoder === undefined) roles.encoder = { node: id }
371
+ if (typeof inputs.prompt === 'string' && roles.positive === undefined) roles.positive = { node: id, key: 'prompt' }
372
+ else if (typeof inputs.text === 'string' && roles.positive === undefined) roles.positive = { node: id, key: 'text' }
373
+ if (typeof inputs.negative_prompt === 'string' && roles.negative === undefined) roles.negative = { node: id, key: 'negative_prompt' }
374
+ if (typeof inputs.resolution === 'number' && roles.resolution === undefined) roles.resolution = { node: id, key: 'resolution' }
375
+ }
376
+ if (node.class_type === 'KSampler' && roles.sampler === undefined) {
377
+ roles.sampler = { node: id, keys: { seed: 'seed', steps: 'steps', cfg: 'cfg', sampler: 'sampler_name', scheduler: 'scheduler', denoise: 'denoise' } }
378
+ }
379
+ // 尺寸节点:width/height 可能已经被接线成「分辨率选择器」的引用,插件照样会把它换成字面量。
380
+ if (roles.latent === undefined && /^Empty/.test(String(node.class_type)) && 'width' in inputs && 'height' in inputs) {
381
+ roles.latent = { node: id, keys: { width: 'width', height: 'height' } }
382
+ }
383
+ if (SINK_TYPES.has(node.class_type) && roles.output === undefined && typeof inputs.filename_prefix === 'string') {
384
+ roles.output = { node: id, key: 'filename_prefix' }
385
+ }
386
+ if (node.class_type === 'LoadImage') roles.sources.push({ node: id, key: 'image' })
387
+ }
388
+ // CLIPTextEncode 风格的负向提示词:采样器的 negative 输入指向的那个编码节点。
389
+ if (roles.negative === undefined && roles.sampler !== undefined) {
390
+ const negativeRef = prompt[roles.sampler.node].inputs.negative
391
+ if (Array.isArray(negativeRef)) {
392
+ const negativeNode = prompt[negativeRef[0]]
393
+ if (negativeNode !== undefined && negativeNode.class_type === 'CLIPTextEncode' && typeof negativeNode.inputs.text === 'string') {
394
+ roles.negative = { node: negativeRef[0], key: 'text' }
395
+ }
396
+ }
397
+ }
398
+ // 编辑工作流:encoder 的第一张参考图就是被编辑的原图。
399
+ if (roles.encoder !== undefined) {
400
+ const images = prompt[roles.encoder.node].inputs.images
401
+ if (images && typeof images === 'object' && Array.isArray(images.image_1)) {
402
+ const id = images.image_1[0]
403
+ if (prompt[id] && prompt[id].class_type === 'LoadImage') roles.sourceImage = { node: id, key: 'image' }
404
+ }
405
+ }
406
+ return roles
407
+ }
408
+
409
+ /** 把转换结果写成一份便于人看的摘要(spike / 设置面板诊断都用它)。 */
410
+ export function summarizeApi(prompt) {
411
+ const lines = []
412
+ for (const [id, node] of Object.entries(prompt)) {
413
+ const inputs = node.inputs
414
+ const parts = []
415
+ for (const [key, value] of Object.entries(inputs)) {
416
+ if (Array.isArray(value) && typeof value[0] === 'string') parts.push(key + ' ← ' + value[0] + ':' + value[1])
417
+ else if (value && typeof value === 'object') parts.push(key + ' ← {' + Object.keys(value).length + ' 项}')
418
+ else {
419
+ const text = typeof value === 'string' ? JSON.stringify(value.length > 60 ? value.slice(0, 60) + '…' : value) : JSON.stringify(value)
420
+ parts.push(key + ' = ' + text)
421
+ }
422
+ }
423
+ lines.push(id + ' ' + node.class_type + (parts.length > 0 ? ' ' + parts.join(', ') : ''))
424
+ }
425
+ return lines.join('\n')
426
+ }
@@ -0,0 +1,12 @@
1
+ /* 由 tools/build.mjs 生成 —— 请勿直接编辑;改 src/ 下的源文件。 */
2
+ /** Shared command dispatch; adapters supply operations, the core owns isolation. */
3
+ import { documentTransaction } from './document-core.js'
4
+
5
+ export function createDocumentCommands(handlers) {
6
+ return {
7
+ execute(current, command, options) {
8
+ if (!command || typeof command.type !== 'string' || !Object.hasOwn(handlers, command.type)) throw new Error('未知画布命令')
9
+ return documentTransaction(current, (draft) => handlers[command.type](draft, command), options)
10
+ },
11
+ }
12
+ }
@@ -0,0 +1,29 @@
1
+ /* 由 tools/build.mjs 生成 —— 请勿直接编辑;改 src/ 下的源文件。 */
2
+ /* Shared document and transaction boundary; no filesystem or UI dependencies. */
3
+ import { normalizeDrawioDoc } from './style-kernel.js'
4
+
5
+ export function cloneDocument(value) {
6
+ return JSON.parse(JSON.stringify(value))
7
+ }
8
+
9
+ export function emptyDocument() {
10
+ return { version: 2, revision: '', meta: { layout: 'dagre-tb' }, nodes: [], edges: [],
11
+ layers: [{ id: '1', name: '', visible: true, locked: false }] }
12
+ }
13
+
14
+ export function normalizeDocument(raw) {
15
+ const source = raw && typeof raw === 'object' ? cloneDocument(raw) : {}
16
+ const normalized = normalizeDrawioDoc(source)
17
+ // Keep extension fields (including future creative metadata) outside XML attributes.
18
+ return { ...source, ...normalized,
19
+ nodes: normalized.nodes.map((node, i) => ({ ...source.nodes[i], ...node })),
20
+ edges: normalized.edges.map((edge, i) => ({ ...source.edges[i], ...edge })) }
21
+ }
22
+
23
+ export function documentTransaction(current, mutate, options = {}) {
24
+ if (options.expectRevision !== undefined && options.expectRevision !== current.revision) throw new Error('revision conflict')
25
+ const draft = cloneDocument(current)
26
+ const finish = (result) => ({ doc: draft, result })
27
+ const result = mutate(draft)
28
+ return result && typeof result.then === 'function' ? result.then(finish) : finish(result)
29
+ }
@@ -71,6 +71,19 @@ export function createDrawingTaskManager(options) {
71
71
  } catch { /* A damaged record must not prevent other tasks from loading. */ }
72
72
  }
73
73
  }
74
+ function migrationRecords(scope, from) {
75
+ load(scope)
76
+ const root = rootOf(scope), selected = []
77
+ for (const name of readdirSync(root)) {
78
+ if (!/^[a-f0-9-]{36}$/.test(name)) continue
79
+ const directory = join(root, name)
80
+ if (!contained(root, directory) || !contained(directory, join(directory, 'job.json'))) continue
81
+ const data = jobs.get(name) || JSON.parse(readFileSync(join(directory, 'job.json'), 'utf8'))
82
+ if (data.id === name && fileIdentity(data.scope.workspaceRoot) === fileIdentity(scope.workspaceRoot) &&
83
+ fileIdentity(data.scope.drawioAbs) === fileIdentity(from)) selected.push({ data, directory, live: jobs.has(name) })
84
+ }
85
+ return selected
86
+ }
74
87
  function owned(scope, id) {
75
88
  load(scope)
76
89
  const job = jobs.get(id)
@@ -165,6 +178,19 @@ export function createDrawingTaskManager(options) {
165
178
  }
166
179
  return {
167
180
  enqueue,
181
+ canMigrateCanvas(scope, from) {
182
+ return !migrationRecords(scope, from).some(({ data: job }) =>
183
+ ['queued', 'running', 'cancelling'].includes(job.status) || (job.status === 'succeeded' && job.kind !== 'extract' && job.delivery === 'pending'))
184
+ },
185
+ migrateCanvas(scope, from, to) {
186
+ const selected = migrationRecords(scope, from)
187
+ if (selected.some(({ data: job }) => ['queued', 'running', 'cancelling'].includes(job.status))) throw new Error('画布后台任务仍在运行,完成后下次打开时迁移')
188
+ for (const { data: job, directory, live } of selected) {
189
+ job.scope = { ...job.scope, drawioAbs: to, path: to }
190
+ if (live) persist(job)
191
+ else atomic(join(directory, 'job.json'), job)
192
+ }
193
+ },
168
194
  recordCommit(job, node) { job.createdNode = node; persist(job) },
169
195
  list(scope) { load(scope); return [...jobs.values()].filter((job) => ownerKey(job.scope) === ownerKey(scope)).sort((a, b) => a.order - b.order).map(view) },
170
196
  result(scope, id) { const job = owned(scope, id); if (!job.resultPath || !existsSync(job.resultPath)) throw new Error('结果尚未生成'); return { job: view(job), output: JSON.parse(readFileSync(job.resultPath, 'utf8')) } },