dsh-drawai 0.3.4 → 0.4.1

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 (538) hide show
  1. package/LICENSE +4154 -0
  2. package/README.md +49 -11
  3. package/lib/audio-media.js +150 -0
  4. package/lib/audio-service.js +66 -0
  5. package/lib/canvas-format.js +134 -0
  6. package/lib/client.js +5090 -184
  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-runner.js +6 -4
  12. package/lib/drawing-tasks.js +26 -0
  13. package/lib/ffmpeg-manager.js +1056 -0
  14. package/lib/imagegen.mjs +596 -0
  15. package/lib/index.js +1762 -129
  16. package/lib/media.js +26 -13
  17. package/lib/mgstyle-core.js +75 -0
  18. package/lib/motion/apply.js +181 -0
  19. package/lib/motion/asset-pack-lock.js +10 -0
  20. package/lib/motion/asset-pack.js +335 -0
  21. package/lib/motion/assets.js +291 -0
  22. package/lib/motion/audio.js +103 -0
  23. package/lib/motion/audiolevel.js +63 -0
  24. package/lib/motion/audiomix.js +144 -0
  25. package/lib/motion/beats.js +338 -0
  26. package/lib/motion/builtin-assets.js +62 -0
  27. package/lib/motion/canvas-spec.js +442 -0
  28. package/lib/motion/capture.js +95 -0
  29. package/lib/motion/cards.js +80 -0
  30. package/lib/motion/collect.js +449 -0
  31. package/lib/motion/delivery.js +140 -0
  32. package/lib/motion/edge-speech.py +90 -0
  33. package/lib/motion/entry.jsx +73 -0
  34. package/lib/motion/export.js +200 -0
  35. package/lib/motion/ffmpeg.js +43 -0
  36. package/lib/motion/fonts.js +71 -0
  37. package/lib/motion/jobs.js +117 -0
  38. package/lib/motion/json.js +4 -0
  39. package/lib/motion/media-catalog.js +59 -0
  40. package/lib/motion/mgstyles/BRIEF-TEMPLATE.md +63 -0
  41. package/lib/motion/mgstyles/briefs/01-flat-vector.md +104 -0
  42. package/lib/motion/mgstyles/briefs/02-line-art.md +97 -0
  43. package/lib/motion/mgstyles/briefs/03-isometric.md +108 -0
  44. package/lib/motion/mgstyles/briefs/05-cel-boil.md +145 -0
  45. package/lib/motion/mgstyles/briefs/06-collage.md +149 -0
  46. package/lib/motion/mgstyles/briefs/07-liquid.md +106 -0
  47. package/lib/motion/mgstyles/briefs/08-morph.md +111 -0
  48. package/lib/motion/mgstyles/briefs/09-bauhaus.md +150 -0
  49. package/lib/motion/mgstyles/briefs/10-synthwave.md +151 -0
  50. package/lib/motion/mgstyles/briefs/12-aurora-glass.md +147 -0
  51. package/lib/motion/mgstyles/briefs/18-hanazi.md +140 -0
  52. package/lib/motion/mgstyles/briefs/19-paperclip.md +156 -0
  53. package/lib/motion/mgstyles/briefs/20-pixel.md +118 -0
  54. package/lib/motion/mgstyles/briefs/22-hud.md +118 -0
  55. package/lib/motion/mgstyles/catalog.d/01-flat-vector.json +34 -0
  56. package/lib/motion/mgstyles/catalog.d/02-line-art.json +34 -0
  57. package/lib/motion/mgstyles/catalog.d/03-isometric.json +35 -0
  58. package/lib/motion/mgstyles/catalog.d/05-cel-boil.json +28 -0
  59. package/lib/motion/mgstyles/catalog.d/06-collage.json +28 -0
  60. package/lib/motion/mgstyles/catalog.d/07-liquid.json +28 -0
  61. package/lib/motion/mgstyles/catalog.d/08-morph.json +28 -0
  62. package/lib/motion/mgstyles/catalog.d/09-bauhaus.json +28 -0
  63. package/lib/motion/mgstyles/catalog.d/10-synthwave.json +28 -0
  64. package/lib/motion/mgstyles/catalog.d/12-aurora-glass.json +28 -0
  65. package/lib/motion/mgstyles/catalog.d/18-hanazi.json +28 -0
  66. package/lib/motion/mgstyles/catalog.d/19-paperclip.json +28 -0
  67. package/lib/motion/mgstyles/catalog.d/20-pixel.json +28 -0
  68. package/lib/motion/mgstyles/catalog.d/22-hud.json +28 -0
  69. package/lib/motion/mgstyles/catalog.json +1356 -0
  70. package/lib/motion/mgstyles/upstream/README.md +147 -0
  71. package/lib/motion/mgstyles/upstream/README.zh-CN.md +147 -0
  72. package/lib/motion/mgstyles/upstream/demos/01-flat-vector/cues.json +1 -0
  73. package/lib/motion/mgstyles/upstream/demos/01-flat-vector/index.html +712 -0
  74. package/lib/motion/mgstyles/upstream/demos/02-line-art/cues.json +331 -0
  75. package/lib/motion/mgstyles/upstream/demos/02-line-art/film.js +676 -0
  76. package/lib/motion/mgstyles/upstream/demos/02-line-art/index.html +18 -0
  77. package/lib/motion/mgstyles/upstream/demos/02-line-art/tools/dump_timing.mjs +26 -0
  78. package/lib/motion/mgstyles/upstream/demos/03-isometric/cues.json +109 -0
  79. package/lib/motion/mgstyles/upstream/demos/03-isometric/index.html +25 -0
  80. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/anim.js +82 -0
  81. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/main.js +219 -0
  82. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/night5.js +180 -0
  83. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/render.js +202 -0
  84. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/title.js +167 -0
  85. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/title5.js +294 -0
  86. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/ui.js +141 -0
  87. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/world.js +1399 -0
  88. package/lib/motion/mgstyles/upstream/demos/05-cel-boil/cues.json +157 -0
  89. package/lib/motion/mgstyles/upstream/demos/05-cel-boil/index.html +34 -0
  90. package/lib/motion/mgstyles/upstream/demos/05-cel-boil/js/engine.js +326 -0
  91. package/lib/motion/mgstyles/upstream/demos/05-cel-boil/js/scene.js +2036 -0
  92. package/lib/motion/mgstyles/upstream/demos/06-collage/assets/gen/layout.json +157 -0
  93. package/lib/motion/mgstyles/upstream/demos/06-collage/cues.json +80 -0
  94. package/lib/motion/mgstyles/upstream/demos/06-collage/index.html +889 -0
  95. package/lib/motion/mgstyles/upstream/demos/07-liquid/cues.json +100 -0
  96. package/lib/motion/mgstyles/upstream/demos/07-liquid/index.html +108 -0
  97. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/engine.js +153 -0
  98. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/links.js +64 -0
  99. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/lookdev.js +46 -0
  100. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/scene.js +963 -0
  101. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/shaders.js +647 -0
  102. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/textsdf.js +114 -0
  103. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/type.js +50 -0
  104. package/lib/motion/mgstyles/upstream/demos/08-morph/cues.json +131 -0
  105. package/lib/motion/mgstyles/upstream/demos/08-morph/glyphs.json +1 -0
  106. package/lib/motion/mgstyles/upstream/demos/08-morph/index.html +901 -0
  107. package/lib/motion/mgstyles/upstream/demos/09-bauhaus/cues.json +270 -0
  108. package/lib/motion/mgstyles/upstream/demos/09-bauhaus/film.js +697 -0
  109. package/lib/motion/mgstyles/upstream/demos/09-bauhaus/index.html +12 -0
  110. package/lib/motion/mgstyles/upstream/demos/10-synthwave/cues.json +44 -0
  111. package/lib/motion/mgstyles/upstream/demos/10-synthwave/index.html +1028 -0
  112. package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/cues.json +67 -0
  113. package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/index.html +16 -0
  114. package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/main.js +967 -0
  115. package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/shaders.js +468 -0
  116. package/lib/motion/mgstyles/upstream/demos/18-hanazi/cues.json +117 -0
  117. package/lib/motion/mgstyles/upstream/demos/18-hanazi/index.html +541 -0
  118. package/lib/motion/mgstyles/upstream/demos/19-paperclip/assets/countries-110m.json +1 -0
  119. package/lib/motion/mgstyles/upstream/demos/19-paperclip/assets/stickers/meta.json +34 -0
  120. package/lib/motion/mgstyles/upstream/demos/19-paperclip/cues.json +285 -0
  121. package/lib/motion/mgstyles/upstream/demos/19-paperclip/index.html +599 -0
  122. package/lib/motion/mgstyles/upstream/demos/20-pixel/cues.json +42 -0
  123. package/lib/motion/mgstyles/upstream/demos/20-pixel/film.js +914 -0
  124. package/lib/motion/mgstyles/upstream/demos/20-pixel/index.html +18 -0
  125. package/lib/motion/mgstyles/upstream/demos/22-hud/cues.json +108 -0
  126. package/lib/motion/mgstyles/upstream/demos/22-hud/index.html +125 -0
  127. package/lib/motion/mgstyles/upstream/demos/22-hud/js/holo.js +275 -0
  128. package/lib/motion/mgstyles/upstream/demos/22-hud/js/hud.js +855 -0
  129. package/lib/motion/mgstyles/upstream/demos/22-hud/js/post.js +150 -0
  130. package/lib/motion/mgstyles/upstream/demos/22-hud/js/util.js +65 -0
  131. package/lib/motion/mgstyles/upstream/demos/22-hud/js/v5.js +142 -0
  132. package/lib/motion/mgstyles/upstream/harness/render.mjs +319 -0
  133. package/lib/motion/mgstyles/upstream/manifest.json +269 -0
  134. package/lib/motion/mgstyles/upstream/prompts/01-flat-vector.md +98 -0
  135. package/lib/motion/mgstyles/upstream/prompts/02-line-art.md +95 -0
  136. package/lib/motion/mgstyles/upstream/prompts/03-isometric.md +97 -0
  137. package/lib/motion/mgstyles/upstream/prompts/05-cel-boil.md +95 -0
  138. package/lib/motion/mgstyles/upstream/prompts/06-collage.md +95 -0
  139. package/lib/motion/mgstyles/upstream/prompts/07-liquid.md +98 -0
  140. package/lib/motion/mgstyles/upstream/prompts/08-morph.md +95 -0
  141. package/lib/motion/mgstyles/upstream/prompts/09-bauhaus.md +96 -0
  142. package/lib/motion/mgstyles/upstream/prompts/10-synthwave.md +95 -0
  143. package/lib/motion/mgstyles/upstream/prompts/12-aurora-glass.md +96 -0
  144. package/lib/motion/mgstyles/upstream/prompts/18-hanazi.md +95 -0
  145. package/lib/motion/mgstyles/upstream/prompts/19-paperclip.md +96 -0
  146. package/lib/motion/mgstyles/upstream/prompts/20-pixel.md +96 -0
  147. package/lib/motion/mgstyles/upstream/prompts/22-hud.md +95 -0
  148. package/lib/motion/mgstyles/upstream/rubric.md +51 -0
  149. package/lib/motion/mgstyles/upstream/template.md +36 -0
  150. package/lib/motion/pixelqa.js +198 -0
  151. package/lib/motion/preview.js +97 -0
  152. package/lib/motion/project.js +395 -0
  153. package/lib/motion/qa.js +290 -0
  154. package/lib/motion/reference-media.jsx +10 -0
  155. package/lib/motion/render-settings.js +112 -0
  156. package/lib/motion/render.js +161 -0
  157. package/lib/motion/runtime/package-lock.json +3058 -0
  158. package/lib/motion/runtime/package.json +16 -0
  159. package/lib/motion/scene-kit.js +183 -0
  160. package/lib/motion/sfx.js +232 -0
  161. package/lib/motion/shotcraft/ClipCard.tsx +204 -0
  162. package/lib/motion/shotcraft/catalog.json +2461 -0
  163. package/lib/motion/shotcraft/upstream/SKILL.md +286 -0
  164. package/lib/motion/shotcraft/upstream/assets/lib/Caption.tsx +54 -0
  165. package/lib/motion/shotcraft/upstream/assets/lib/ClipCard.tsx +200 -0
  166. package/lib/motion/shotcraft/upstream/assets/lib/DigitRoll.tsx +45 -0
  167. package/lib/motion/shotcraft/upstream/assets/lib/FlashCut.tsx +20 -0
  168. package/lib/motion/shotcraft/upstream/assets/lib/FlatPanel.tsx +65 -0
  169. package/lib/motion/shotcraft/upstream/assets/lib/PageCam.tsx +151 -0
  170. package/lib/motion/shotcraft/upstream/assets/lib/VerticalTicker.tsx +129 -0
  171. package/lib/motion/shotcraft/upstream/assets/lib/helpers/camera.tsx +75 -0
  172. package/lib/motion/shotcraft/upstream/assets/lib/helpers/motion.ts +40 -0
  173. package/lib/motion/shotcraft/upstream/assets/lib/helpers/rand.ts +11 -0
  174. package/lib/motion/shotcraft/upstream/assets/lib/helpers/shake.ts +10 -0
  175. package/lib/motion/shotcraft/upstream/assets/scripts/__pycache__/sfx-source.cpython-313.pyc +0 -0
  176. package/lib/motion/shotcraft/upstream/assets/scripts/build-readme-cover.mjs +49 -0
  177. package/lib/motion/shotcraft/upstream/assets/scripts/capture-template.mjs +210 -0
  178. package/lib/motion/shotcraft/upstream/assets/scripts/sfx-source.py +423 -0
  179. package/lib/motion/shotcraft/upstream/assets/scripts/smoke-render-demos.py +170 -0
  180. package/lib/motion/shotcraft/upstream/assets/scripts/test_sfx_source.py +157 -0
  181. package/lib/motion/shotcraft/upstream/demos/README.md +120 -0
  182. package/lib/motion/shotcraft/upstream/demos/_fixtures/Brand.tsx +112 -0
  183. package/lib/motion/shotcraft/upstream/demos/_fixtures/Fixtures.tsx +647 -0
  184. package/lib/motion/shotcraft/upstream/demos/_fixtures/Look.tsx +316 -0
  185. package/lib/motion/shotcraft/upstream/demos/_fixtures/Motion.tsx +82 -0
  186. package/lib/motion/shotcraft/upstream/demos/_fixtures/PageCam2D.tsx +115 -0
  187. package/lib/motion/shotcraft/upstream/demos/_fixtures/Polish.tsx +243 -0
  188. package/lib/motion/shotcraft/upstream/demos/_textures/live-layout.json +389 -0
  189. package/lib/motion/shotcraft/upstream/demos/camera/basic-3d-scene/Basic3DScene.tsx +250 -0
  190. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashImpactReal.tsx +305 -0
  191. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashZoomReal.tsx +246 -0
  192. package/lib/motion/shotcraft/upstream/demos/camera/cursor-flyover/CursorFlyover.tsx +390 -0
  193. package/lib/motion/shotcraft/upstream/demos/camera/depth-layer-moves/MultiplaneReal.tsx +138 -0
  194. package/lib/motion/shotcraft/upstream/demos/camera/graze-face-tour/GrazeFaceTour.tsx +542 -0
  195. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/OverheadTabletopDrop.tsx +315 -0
  196. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/TiltReveal.tsx +299 -0
  197. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/DroneDiveLanding.tsx +173 -0
  198. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/ExplodedView.tsx +348 -0
  199. package/lib/motion/shotcraft/upstream/demos/camera/steep-tilt-glide/SteepTiltGlide.tsx +366 -0
  200. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx +279 -0
  201. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/PullBackIsolation.tsx +184 -0
  202. package/lib/motion/shotcraft/upstream/demos/camera/terminal-3d/Terminal3D.tsx +390 -0
  203. package/lib/motion/shotcraft/upstream/demos/data/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +155 -0
  204. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/AxisRescaleShockV2.tsx +303 -0
  205. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/OscilloscopeStreamV2.tsx +290 -0
  206. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/UnitDotSwarmRegroupV2.tsx +278 -0
  207. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/NeedleSweepSelftest.tsx +307 -0
  208. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/TapeScrollFixedPointer.tsx +215 -0
  209. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/BrakeReticleLock.tsx +299 -0
  210. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/ChangelogScrollBrake.tsx +232 -0
  211. package/lib/motion/shotcraft/upstream/demos/data/timeline-travel/TimelineTravel.tsx +290 -0
  212. package/lib/motion/shotcraft/upstream/demos/effects/assemble-then-type-flyin/AssembleThenTypeFlyin.tsx +273 -0
  213. package/lib/motion/shotcraft/upstream/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx +167 -0
  214. package/lib/motion/shotcraft/upstream/demos/effects/brand-frame-snap/BrandFrameSnap.tsx +536 -0
  215. package/lib/motion/shotcraft/upstream/demos/effects/fui-hud-moves/ReticleLockOn.tsx +164 -0
  216. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/FlylineArc.tsx +175 -0
  217. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/GlowOrbAmbient.tsx +197 -0
  218. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/OrbFlylineRelay.tsx +241 -0
  219. package/lib/motion/shotcraft/upstream/demos/effects/icon-performance-moves/AttentionBounce.tsx +279 -0
  220. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/AnimeImpact.tsx +230 -0
  221. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/HitCounter.tsx +345 -0
  222. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SheenSweepRetry.tsx +275 -0
  223. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SpotlightSweepReveal.tsx +229 -0
  224. package/lib/motion/shotcraft/upstream/demos/effects/radial-ripple-phone-chips/RadialRipplePhoneChips.tsx +312 -0
  225. package/lib/motion/shotcraft/upstream/demos/effects/riso-print-hits/RisoMisregistrationHit.tsx +222 -0
  226. package/lib/motion/shotcraft/upstream/demos/effects/scan-bracket-sweep/ScanBracketSweep.tsx +295 -0
  227. package/lib/motion/shotcraft/upstream/demos/effects/scanline-annotate-focus/ScanlineAnnotateFocus.tsx +329 -0
  228. package/lib/motion/shotcraft/upstream/demos/effects/scanline-assemble-flyin/ScanlineAssembleFlyin.tsx +315 -0
  229. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ImpactBurstKit.tsx +264 -0
  230. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/KanadaPerspectiveSnap.tsx +260 -0
  231. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ScoreSlam.tsx +263 -0
  232. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/CornerSpotlightReveal.tsx +123 -0
  233. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +187 -0
  234. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/SlideSpotlightPan.tsx +175 -0
  235. package/lib/motion/shotcraft/upstream/demos/interaction/autolayout-gap-dial/AutolayoutGapDial.tsx +305 -0
  236. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/DiagramCascadeBuild.tsx +350 -0
  237. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +352 -0
  238. package/lib/motion/shotcraft/upstream/demos/interaction/chip-grid-single-select-blackout/ChipGridSingleSelectBlackout.tsx +218 -0
  239. package/lib/motion/shotcraft/upstream/demos/interaction/collab-cursor-moves/CursorCastEnsemble.tsx +297 -0
  240. package/lib/motion/shotcraft/upstream/demos/interaction/glass-pill-dictation-typing/GlassPillDictationTyping.tsx +157 -0
  241. package/lib/motion/shotcraft/upstream/demos/interaction/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +218 -0
  242. package/lib/motion/shotcraft/upstream/demos/interaction/picker-carousel-feature-cycle/PickerCarouselFeatureCycle.tsx +202 -0
  243. package/lib/motion/shotcraft/upstream/demos/interaction/segmented-thumb-hero/SegmentedThumbHero.tsx +265 -0
  244. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/PaletteThemeRipple.tsx +457 -0
  245. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/ThemeSweepToggle.tsx +446 -0
  246. package/lib/motion/shotcraft/upstream/demos/interaction/type-and-filter/TypeAndFilter.tsx +249 -0
  247. package/lib/motion/shotcraft/upstream/demos/interaction/voice-waveform-live/VoiceWaveformLive.tsx +278 -0
  248. package/lib/motion/shotcraft/upstream/demos/opening/crane-rise-reveal/CraneRiseReveal.tsx +332 -0
  249. package/lib/motion/shotcraft/upstream/demos/opening/dataviz-landscape-open/DatavizLandscapeOpen.tsx +358 -0
  250. package/lib/motion/shotcraft/upstream/demos/opening/fracture/Fracture.tsx +201 -0
  251. package/lib/motion/shotcraft/upstream/demos/opening/icon-field-colorize/IconFieldColorize.tsx +200 -0
  252. package/lib/motion/shotcraft/upstream/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx +208 -0
  253. package/lib/motion/shotcraft/upstream/demos/opening/magician-card-flourish/MagicianCardFlourish.tsx +341 -0
  254. package/lib/motion/shotcraft/upstream/demos/opening/orbit-ring-title-open/OrbitRingTitleOpen.tsx +389 -0
  255. package/lib/motion/shotcraft/upstream/demos/opening/spotlight-hero-card/SpotlightHeroCard.tsx +293 -0
  256. package/lib/motion/shotcraft/upstream/demos/opening/stroke-segment-build/StrokeSegmentBuild.tsx +183 -0
  257. package/lib/motion/shotcraft/upstream/demos/opening/text-as-mask/TextAsMask.tsx +245 -0
  258. package/lib/motion/shotcraft/upstream/demos/outro/grain-dissolve/GrainDissolve.tsx +222 -0
  259. package/lib/motion/shotcraft/upstream/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx +223 -0
  260. package/lib/motion/shotcraft/upstream/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx +217 -0
  261. package/lib/motion/shotcraft/upstream/demos/outro/outro-group-photo-launch/OutroGroupPhotoLaunch.tsx +343 -0
  262. package/lib/motion/shotcraft/upstream/demos/outro/ui-strip-away-outro/UiStripAwayOutro.tsx +357 -0
  263. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/IconFlipBloomLogo.tsx +187 -0
  264. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/InputMorphsIntoLogo.tsx +333 -0
  265. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-cut-moves/PaparazziFlash.tsx +274 -0
  266. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +270 -0
  267. package/lib/motion/shotcraft/upstream/demos/rhythm/panel-grid-moves/ComicPanelSplit.tsx +430 -0
  268. package/lib/motion/shotcraft/upstream/demos/rhythm/quad-split-parallel-scenes/QuadSplitParallelScenes.tsx +252 -0
  269. package/lib/motion/shotcraft/upstream/demos/rhythm/rhythm-interrupt-moves/JumpCutPunchIn.tsx +106 -0
  270. package/lib/motion/shotcraft/upstream/demos/rhythm/sakuga-timing-shift/SakugaTimingShift.tsx +288 -0
  271. package/lib/motion/shotcraft/upstream/demos/rhythm/speed-ramp-freeze/FreezeAnnotateReal.tsx +362 -0
  272. package/lib/motion/shotcraft/upstream/demos/rhythm/trailer-grammar-moves/TrailerBumper.tsx +168 -0
  273. package/lib/motion/shotcraft/upstream/demos/transition/bottom-push-stack-wipe/BottomPushStackWipe.tsx +310 -0
  274. package/lib/motion/shotcraft/upstream/demos/transition/card-flip-reveal/CardFlipReveal.tsx +261 -0
  275. package/lib/motion/shotcraft/upstream/demos/transition/card-flock-tumble/CardFlockTumble.tsx +459 -0
  276. package/lib/motion/shotcraft/upstream/demos/transition/circle-match-iris/CircleMatchIris.tsx +294 -0
  277. package/lib/motion/shotcraft/upstream/demos/transition/gradient-transition/GradientTransition.tsx +161 -0
  278. package/lib/motion/shotcraft/upstream/demos/transition/line-carry-transition/LineCarryTransition.tsx +248 -0
  279. package/lib/motion/shotcraft/upstream/demos/transition/mosaic-reframe/MosaicReframe.tsx +359 -0
  280. package/lib/motion/shotcraft/upstream/demos/transition/page-turn-transitions/BarnDoorSplit.tsx +227 -0
  281. package/lib/motion/shotcraft/upstream/demos/transition/print-texture-transitions/InkBleedReveal.tsx +162 -0
  282. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/PortalWipeV2.tsx +248 -0
  283. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/WhipBrakeReal.tsx +186 -0
  284. package/lib/motion/shotcraft/upstream/demos/transition/tear-streak-transitions/GlitchDisplace.tsx +355 -0
  285. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/InvisibleCut.tsx +272 -0
  286. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/LightLeakBurn.tsx +262 -0
  287. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/VersusSlam.tsx +217 -0
  288. package/lib/motion/shotcraft/upstream/demos/transition/transition-travel/LetterformZoom.tsx +285 -0
  289. package/lib/motion/shotcraft/upstream/demos/transition/white-flash-logo-simplify-cut/WhiteFlashLogoSimplifyCut.tsx +205 -0
  290. package/lib/motion/shotcraft/upstream/demos/transition/wipe-transitions/BlindsSlice.tsx +178 -0
  291. package/lib/motion/shotcraft/upstream/demos/typography/blur-slide/BlurSlide.tsx +147 -0
  292. package/lib/motion/shotcraft/upstream/demos/typography/brace-expand/BraceExpand.tsx +143 -0
  293. package/lib/motion/shotcraft/upstream/demos/typography/brand-ink-open/BrandInkOpen.tsx +134 -0
  294. package/lib/motion/shotcraft/upstream/demos/typography/countdown-arc-scatter/CountdownArcScatter.tsx +217 -0
  295. package/lib/motion/shotcraft/upstream/demos/typography/flying-words/FlyingWords.tsx +198 -0
  296. package/lib/motion/shotcraft/upstream/demos/typography/glitch-cycle/GlitchCycle.tsx +221 -0
  297. package/lib/motion/shotcraft/upstream/demos/typography/gradient-word-sweep/GradientWordSweep.tsx +312 -0
  298. package/lib/motion/shotcraft/upstream/demos/typography/lead-word-zoom-assemble/LeadWordZoomAssemble.tsx +261 -0
  299. package/lib/motion/shotcraft/upstream/demos/typography/marker-underline-title/MarkerUnderlineTitle.tsx +121 -0
  300. package/lib/motion/shotcraft/upstream/demos/typography/outline-word-fill/OutlineWordFill.tsx +153 -0
  301. package/lib/motion/shotcraft/upstream/demos/typography/paper-title-card/PaperTitleCard.tsx +179 -0
  302. package/lib/motion/shotcraft/upstream/demos/typography/pill-chip-slot-cycle-handled/PillChipSlotCycleHandled.tsx +140 -0
  303. package/lib/motion/shotcraft/upstream/demos/typography/pill-slot-cycle/PillSlotCycle.tsx +309 -0
  304. package/lib/motion/shotcraft/upstream/demos/typography/text-column-converge/TextColumnConverge.tsx +191 -0
  305. package/lib/motion/shotcraft/upstream/demos/typography/title-demote-to-label/TitleDemoteToLabel.tsx +292 -0
  306. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/LetterformDriftAssembly.tsx +135 -0
  307. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/SplitTextStagger.tsx +124 -0
  308. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/TextOnPath.tsx +255 -0
  309. package/lib/motion/shotcraft/upstream/demos/typography/type-entrance-moves/LetterDropPhysics.tsx +173 -0
  310. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/FontWeightPump.tsx +225 -0
  311. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/KaraokeFillSync.tsx +141 -0
  312. package/lib/motion/shotcraft/upstream/demos/typography/typewriter-moves/TypewriterErrorRetype.tsx +137 -0
  313. package/lib/motion/shotcraft/upstream/demos/typography/vertical-word-roll-blur-cycle/VerticalWordRollBlurCycle.tsx +147 -0
  314. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-filmstrip/WordRelayFilmstrip.tsx +409 -0
  315. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-geometry/WordRelayGeometry.tsx +280 -0
  316. package/lib/motion/shotcraft/upstream/demos/ui-entrance/avatar-bracket-carousel/AvatarBracketCarousel.tsx +271 -0
  317. package/lib/motion/shotcraft/upstream/demos/ui-entrance/bezier-source-converge-merge/BezierSourceConvergeMerge.tsx +385 -0
  318. package/lib/motion/shotcraft/upstream/demos/ui-entrance/card-stack/CardStack.tsx +312 -0
  319. package/lib/motion/shotcraft/upstream/demos/ui-entrance/carousel-3d/Carousel3D.tsx +303 -0
  320. package/lib/motion/shotcraft/upstream/demos/ui-entrance/clipcard-looping/ClipCardLooping.tsx +77 -0
  321. package/lib/motion/shotcraft/upstream/demos/ui-entrance/cloner-depth-echo/ClonerDepthEcho.tsx +311 -0
  322. package/lib/motion/shotcraft/upstream/demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx +307 -0
  323. package/lib/motion/shotcraft/upstream/demos/ui-entrance/doc-park-left-pill-deal/DocParkLeftPillDeal.tsx +349 -0
  324. package/lib/motion/shotcraft/upstream/demos/ui-entrance/document-typewriter-reveal/DocumentTypewriterReveal.tsx +255 -0
  325. package/lib/motion/shotcraft/upstream/demos/ui-entrance/draw-svg-trace/DrawSvgTrace.tsx +244 -0
  326. package/lib/motion/shotcraft/upstream/demos/ui-entrance/element-body-moves/ContactShadowLift.tsx +217 -0
  327. package/lib/motion/shotcraft/upstream/demos/ui-entrance/integration-hub-map/IntegrationHubMap.tsx +652 -0
  328. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-reveal/ListReveal.tsx +153 -0
  329. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-stack-press/ListStackPress.tsx +238 -0
  330. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-forerun/NeonFrameForerun.tsx +324 -0
  331. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +354 -0
  332. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/PageWaterfallWall.tsx +101 -0
  333. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/VerticalTicker.tsx +129 -0
  334. package/lib/motion/shotcraft/upstream/demos/ui-entrance/product-card-progressive-assemble/ProductCardProgressiveAssemble.tsx +297 -0
  335. package/lib/motion/shotcraft/upstream/demos/ui-entrance/radial-wave/RadialWave.tsx +57 -0
  336. package/lib/motion/shotcraft/upstream/demos/ui-entrance/research-card-stack-scroll/ResearchCardStackScroll.tsx +155 -0
  337. package/lib/motion/shotcraft/upstream/demos/ui-entrance/row-embed/RowEmbed.tsx +175 -0
  338. package/lib/motion/shotcraft/upstream/demos/ui-entrance/value-stagger-gradient/ValueStaggerGradient.tsx +153 -0
  339. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/BentoLightUp.tsx +146 -0
  340. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/WireframeDrawOn.tsx +226 -0
  341. package/lib/motion/shotcraft/upstream/gallery/api/library.json +1 -0
  342. package/lib/motion/shotcraft/upstream/manifest.json +2715 -0
  343. package/lib/motion/shotcraft/upstream/references/aesthetic-rules.md +193 -0
  344. package/lib/motion/shotcraft/upstream/references/final-review.md +121 -0
  345. package/lib/motion/shotcraft/upstream/references/guided-free-creation.md +199 -0
  346. package/lib/motion/shotcraft/upstream/references/jianying-export.md +183 -0
  347. package/lib/motion/shotcraft/upstream/references/music-beat-sync.md +257 -0
  348. package/lib/motion/shotcraft/upstream/references/pipeline.md +382 -0
  349. package/lib/motion/shotcraft/upstream/references/publish-upload-post.md +111 -0
  350. package/lib/motion/shotcraft/upstream/references/sequences/promo-energy-arc.md +50 -0
  351. package/lib/motion/shotcraft/upstream/references/sfx-sourcing.md +95 -0
  352. package/lib/motion/shotcraft/upstream/references/shots/camera/basic-3d-scene.md +41 -0
  353. package/lib/motion/shotcraft/upstream/references/shots/camera/crash-zoom-punch.md +52 -0
  354. package/lib/motion/shotcraft/upstream/references/shots/camera/cursor-flyover.md +39 -0
  355. package/lib/motion/shotcraft/upstream/references/shots/camera/depth-layer-moves.md +39 -0
  356. package/lib/motion/shotcraft/upstream/references/shots/camera/graze-face-tour.md +57 -0
  357. package/lib/motion/shotcraft/upstream/references/shots/camera/overhead-camera-moves.md +51 -0
  358. package/lib/motion/shotcraft/upstream/references/shots/camera/space-camera-moves.md +46 -0
  359. package/lib/motion/shotcraft/upstream/references/shots/camera/steep-tilt-glide.md +52 -0
  360. package/lib/motion/shotcraft/upstream/references/shots/camera/tension-camera-moves.md +43 -0
  361. package/lib/motion/shotcraft/upstream/references/shots/camera/terminal-3d.md +42 -0
  362. package/lib/motion/shotcraft/upstream/references/shots/data/before-after-slider-scrub.md +48 -0
  363. package/lib/motion/shotcraft/upstream/references/shots/data/chart-live-moves.md +52 -0
  364. package/lib/motion/shotcraft/upstream/references/shots/data/gauge-readout-moves.md +45 -0
  365. package/lib/motion/shotcraft/upstream/references/shots/data/scroll-brake-moves.md +46 -0
  366. package/lib/motion/shotcraft/upstream/references/shots/data/timeline-travel.md +44 -0
  367. package/lib/motion/shotcraft/upstream/references/shots/effects/assemble-then-type-flyin.md +63 -0
  368. package/lib/motion/shotcraft/upstream/references/shots/effects/aurora-bloom-bg-flip.md +54 -0
  369. package/lib/motion/shotcraft/upstream/references/shots/effects/brand-frame-snap.md +58 -0
  370. package/lib/motion/shotcraft/upstream/references/shots/effects/fui-hud-moves.md +35 -0
  371. package/lib/motion/shotcraft/upstream/references/shots/effects/glow-flyline-moves.md +53 -0
  372. package/lib/motion/shotcraft/upstream/references/shots/effects/icon-performance-moves.md +42 -0
  373. package/lib/motion/shotcraft/upstream/references/shots/effects/impact-feedback.md +50 -0
  374. package/lib/motion/shotcraft/upstream/references/shots/effects/light-play-moves.md +46 -0
  375. package/lib/motion/shotcraft/upstream/references/shots/effects/radial-ripple-phone-chips.md +56 -0
  376. package/lib/motion/shotcraft/upstream/references/shots/effects/riso-print-hits.md +49 -0
  377. package/lib/motion/shotcraft/upstream/references/shots/effects/scan-bracket-sweep.md +50 -0
  378. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-annotate-focus.md +53 -0
  379. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-assemble-flyin.md +53 -0
  380. package/lib/motion/shotcraft/upstream/references/shots/effects/slam-entrance-moves.md +55 -0
  381. package/lib/motion/shotcraft/upstream/references/shots/effects/spotlight-sweep-moves.md +52 -0
  382. package/lib/motion/shotcraft/upstream/references/shots/interaction/autolayout-gap-dial.md +60 -0
  383. package/lib/motion/shotcraft/upstream/references/shots/interaction/canvas-materialize-moves.md +57 -0
  384. package/lib/motion/shotcraft/upstream/references/shots/interaction/chip-grid-single-select-blackout.md +51 -0
  385. package/lib/motion/shotcraft/upstream/references/shots/interaction/collab-cursor-moves.md +41 -0
  386. package/lib/motion/shotcraft/upstream/references/shots/interaction/glass-pill-dictation-typing.md +53 -0
  387. package/lib/motion/shotcraft/upstream/references/shots/interaction/hashtag-to-pill-materialize.md +60 -0
  388. package/lib/motion/shotcraft/upstream/references/shots/interaction/picker-carousel-feature-cycle.md +55 -0
  389. package/lib/motion/shotcraft/upstream/references/shots/interaction/segmented-thumb-hero.md +57 -0
  390. package/lib/motion/shotcraft/upstream/references/shots/interaction/theme-switch-moves.md +47 -0
  391. package/lib/motion/shotcraft/upstream/references/shots/interaction/type-and-filter.md +37 -0
  392. package/lib/motion/shotcraft/upstream/references/shots/interaction/voice-waveform-live.md +54 -0
  393. package/lib/motion/shotcraft/upstream/references/shots/opening/brand-ink-open.md +36 -0
  394. package/lib/motion/shotcraft/upstream/references/shots/opening/crane-rise-reveal.md +56 -0
  395. package/lib/motion/shotcraft/upstream/references/shots/opening/dataviz-landscape-open.md +56 -0
  396. package/lib/motion/shotcraft/upstream/references/shots/opening/fracture.md +40 -0
  397. package/lib/motion/shotcraft/upstream/references/shots/opening/icon-field-colorize.md +60 -0
  398. package/lib/motion/shotcraft/upstream/references/shots/opening/letterspace-materialize.md +57 -0
  399. package/lib/motion/shotcraft/upstream/references/shots/opening/magician-card-flourish.md +73 -0
  400. package/lib/motion/shotcraft/upstream/references/shots/opening/orbit-ring-title-open.md +87 -0
  401. package/lib/motion/shotcraft/upstream/references/shots/opening/spotlight-hero-card.md +55 -0
  402. package/lib/motion/shotcraft/upstream/references/shots/opening/stroke-segment-build.md +50 -0
  403. package/lib/motion/shotcraft/upstream/references/shots/opening/text-as-mask.md +59 -0
  404. package/lib/motion/shotcraft/upstream/references/shots/outro/grain-dissolve.md +38 -0
  405. package/lib/motion/shotcraft/upstream/references/shots/outro/logo-shrink-wordmark-lockup.md +38 -0
  406. package/lib/motion/shotcraft/upstream/references/shots/outro/neon-triple-marquee.md +59 -0
  407. package/lib/motion/shotcraft/upstream/references/shots/outro/outro-group-photo-launch.md +39 -0
  408. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-strip-away-outro.md +61 -0
  409. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-to-brand-morph.md +52 -0
  410. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-cut-moves.md +50 -0
  411. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-step-list-theme-cycle.md +66 -0
  412. package/lib/motion/shotcraft/upstream/references/shots/rhythm/panel-grid-moves.md +43 -0
  413. package/lib/motion/shotcraft/upstream/references/shots/rhythm/quad-split-parallel-scenes.md +38 -0
  414. package/lib/motion/shotcraft/upstream/references/shots/rhythm/rhythm-interrupt-moves.md +38 -0
  415. package/lib/motion/shotcraft/upstream/references/shots/rhythm/sakuga-timing-shift.md +56 -0
  416. package/lib/motion/shotcraft/upstream/references/shots/rhythm/speed-ramp-freeze.md +44 -0
  417. package/lib/motion/shotcraft/upstream/references/shots/rhythm/trailer-grammar-moves.md +38 -0
  418. package/lib/motion/shotcraft/upstream/references/shots/transition/bottom-push-stack-wipe.md +63 -0
  419. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flip-reveal.md +57 -0
  420. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flock-tumble.md +63 -0
  421. package/lib/motion/shotcraft/upstream/references/shots/transition/circle-match-iris.md +58 -0
  422. package/lib/motion/shotcraft/upstream/references/shots/transition/gradient-transition.md +45 -0
  423. package/lib/motion/shotcraft/upstream/references/shots/transition/line-carry-transition.md +55 -0
  424. package/lib/motion/shotcraft/upstream/references/shots/transition/mosaic-reframe.md +49 -0
  425. package/lib/motion/shotcraft/upstream/references/shots/transition/page-turn-transitions.md +42 -0
  426. package/lib/motion/shotcraft/upstream/references/shots/transition/print-texture-transitions.md +42 -0
  427. package/lib/motion/shotcraft/upstream/references/shots/transition/shot-transitions.md +45 -0
  428. package/lib/motion/shotcraft/upstream/references/shots/transition/tear-streak-transitions.md +48 -0
  429. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-hidden-cut.md +55 -0
  430. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-travel.md +43 -0
  431. package/lib/motion/shotcraft/upstream/references/shots/transition/white-flash-logo-simplify-cut.md +41 -0
  432. package/lib/motion/shotcraft/upstream/references/shots/transition/wipe-transitions.md +42 -0
  433. package/lib/motion/shotcraft/upstream/references/shots/typography/blur-slide.md +59 -0
  434. package/lib/motion/shotcraft/upstream/references/shots/typography/brace-expand.md +55 -0
  435. package/lib/motion/shotcraft/upstream/references/shots/typography/countdown-arc-scatter.md +65 -0
  436. package/lib/motion/shotcraft/upstream/references/shots/typography/document-typewriter-reveal.md +42 -0
  437. package/lib/motion/shotcraft/upstream/references/shots/typography/flying-words.md +64 -0
  438. package/lib/motion/shotcraft/upstream/references/shots/typography/glitch-cycle.md +64 -0
  439. package/lib/motion/shotcraft/upstream/references/shots/typography/gradient-word-sweep.md +54 -0
  440. package/lib/motion/shotcraft/upstream/references/shots/typography/lead-word-zoom-assemble.md +91 -0
  441. package/lib/motion/shotcraft/upstream/references/shots/typography/marker-underline-title.md +51 -0
  442. package/lib/motion/shotcraft/upstream/references/shots/typography/outline-word-fill.md +66 -0
  443. package/lib/motion/shotcraft/upstream/references/shots/typography/paper-title-card.md +38 -0
  444. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-chip-slot-cycle-handled.md +66 -0
  445. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-slot-cycle.md +58 -0
  446. package/lib/motion/shotcraft/upstream/references/shots/typography/text-column-converge.md +61 -0
  447. package/lib/motion/shotcraft/upstream/references/shots/typography/title-demote-to-label.md +64 -0
  448. package/lib/motion/shotcraft/upstream/references/shots/typography/type-assembly-moves.md +45 -0
  449. package/lib/motion/shotcraft/upstream/references/shots/typography/type-entrance-moves.md +41 -0
  450. package/lib/motion/shotcraft/upstream/references/shots/typography/type-rhythm-sync.md +51 -0
  451. package/lib/motion/shotcraft/upstream/references/shots/typography/typewriter-moves.md +42 -0
  452. package/lib/motion/shotcraft/upstream/references/shots/typography/vertical-word-roll-blur-cycle.md +63 -0
  453. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-filmstrip.md +57 -0
  454. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-geometry.md +75 -0
  455. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/avatar-bracket-carousel.md +59 -0
  456. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/bezier-source-converge-merge.md +67 -0
  457. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/card-stack.md +60 -0
  458. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/carousel-3d.md +66 -0
  459. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/cloner-depth-echo.md +40 -0
  460. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/deck-deal-flyin.md +45 -0
  461. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/doc-park-left-pill-deal.md +62 -0
  462. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/draw-svg-trace.md +55 -0
  463. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/element-body-moves.md +37 -0
  464. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/integration-hub-map.md +55 -0
  465. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-reveal.md +50 -0
  466. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-stack-press.md +43 -0
  467. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-forerun.md +55 -0
  468. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-orbit-drop.md +51 -0
  469. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/page-waterfall-wall.md +51 -0
  470. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/product-card-progressive-assemble.md +56 -0
  471. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/radial-wave.md +49 -0
  472. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/research-card-stack-scroll.md +57 -0
  473. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/row-embed.md +36 -0
  474. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/value-stagger-gradient.md +64 -0
  475. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/wall-reveal-moves.md +47 -0
  476. package/lib/motion/shotcraft/upstream/references/sound-design.md +170 -0
  477. package/lib/motion/shotcraft/upstream/references/workbench.md +157 -0
  478. package/lib/motion/shotcraft/upstream/template/TEMPLATE.md +103 -0
  479. package/lib/motion/shotcraft/upstream/template/THEMES.md +44 -0
  480. package/lib/motion/shotcraft/upstream/template/package.json +20 -0
  481. package/lib/motion/shotcraft/upstream/template/remotion.config.ts +6 -0
  482. package/lib/motion/shotcraft/upstream/template/src/Root.tsx +17 -0
  483. package/lib/motion/shotcraft/upstream/template/src/aifl/Caption.tsx +65 -0
  484. package/lib/motion/shotcraft/upstream/template/src/aifl/DigitRoll.tsx +48 -0
  485. package/lib/motion/shotcraft/upstream/template/src/aifl/FlashCut.tsx +24 -0
  486. package/lib/motion/shotcraft/upstream/template/src/aifl/Main.tsx +192 -0
  487. package/lib/motion/shotcraft/upstream/template/src/aifl/PaperTitleCard.tsx +111 -0
  488. package/lib/motion/shotcraft/upstream/template/src/aifl/live/PageCam.tsx +150 -0
  489. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneDetail.tsx +158 -0
  490. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneFlyIn.tsx +468 -0
  491. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOpen.tsx +552 -0
  492. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOutroLive.tsx +411 -0
  493. package/lib/motion/shotcraft/upstream/template/src/aifl/live/ScenePapers.tsx +200 -0
  494. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneWbr.tsx +324 -0
  495. package/lib/motion/shotcraft/upstream/template/src/aifl/live-layout.json +389 -0
  496. package/lib/motion/shotcraft/upstream/template/src/index.ts +4 -0
  497. package/lib/motion/shotcraft/upstream/template/src/themes/ThemedFilm.tsx +7 -0
  498. package/lib/motion/shotcraft/upstream/template/src/themes/manifest.tsx +68 -0
  499. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.json +1 -0
  500. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.ts +24 -0
  501. package/lib/motion/shotcraft/upstream/template/src/themes/palettes.json +74 -0
  502. package/lib/motion/shotcraft/upstream/template/src/themes/visual-theme.tsx +91 -0
  503. package/lib/motion/shotcraft/upstream/template/src/workbench.ts +213 -0
  504. package/lib/motion/shotcraft/upstream/template/tsconfig.json +15 -0
  505. package/lib/motion/spec.js +113 -0
  506. package/lib/motion/style-engine.js +153 -0
  507. package/lib/motion/style-frames.js +271 -0
  508. package/lib/motion/sync.js +214 -0
  509. package/lib/motion/theme.js +121 -0
  510. package/lib/motion/video-runtime.js +192 -0
  511. package/lib/motion/voice.js +417 -0
  512. package/lib/motion-agent-files.js +82 -0
  513. package/lib/motion-agent-protocol.js +66 -0
  514. package/lib/motion-agent-tools.js +196 -0
  515. package/lib/motion-agent.js +171 -0
  516. package/lib/motion-capture.js +93 -0
  517. package/lib/motion-core.js +238 -0
  518. package/lib/motion-film-review.js +71 -0
  519. package/lib/motion-library.js +210 -0
  520. package/lib/motion-planner.js +254 -0
  521. package/lib/motion-project.js +87 -0
  522. package/lib/motion-render-worker.js +153 -0
  523. package/lib/motion-session.js +32 -0
  524. package/lib/motion-source.js +49 -0
  525. package/lib/motion-tasks.js +452 -0
  526. package/lib/motion-vision.js +44 -0
  527. package/lib/mxfile.js +27 -7
  528. package/lib/routing/node-runtime.js +14 -0
  529. package/lib/routing/router.js +211 -0
  530. package/lib/routing/vendor/README.md +96 -0
  531. package/lib/routing/vendor/libavoid-routing.js +753 -0
  532. package/lib/routing/vendor/libavoid.min.js +59 -0
  533. package/lib/shotcard-core.js +39 -0
  534. package/lib/shotcard-reference.js +56 -0
  535. package/lib/style-kernel.js +37 -3
  536. package/lib/task-patches.js +26 -2
  537. package/lib/video-export.js +49 -22
  538. package/package.json +34 -4
@@ -0,0 +1,96 @@
1
+ # 像素风 Pixel Art / 8-bit
2
+
3
+ **原片**:PIXEL QUEST 像素冒险 · 1920×1080 · 30 fps · 10 秒 · AI 评审终评 8.07 / 10
4
+
5
+ **源码**:[demos/20-pixel/](../demos/20-pixel/)
6
+
7
+ ## 怎么用
8
+
9
+ 1. 新建一个空文件夹,在里面打开一个能写代码、能执行命令的 AI 助手(例如 Claude Code)。本机需要能跑网页渲染(Node + Chrome)和 ffmpeg。
10
+ 2. 把下面「提示词」整段复制进去发送。
11
+ 3. 想换成自己的内容:改 `Creative seed` 里的故事、品牌名、文案和配色,或者改 `Output` 里的尺寸(比如竖屏 1080×1920)。不要删 `Signature features` 那一段,它是这种风格被一眼认出来的依据。
12
+ 4. 想再提高:成片出来后,另开一个 AI 用 [rubric.md](../rubric.md) 评审,把评审意见贴回给制作的 AI 再改一轮。原片就是这样改了两轮。
13
+
14
+ ## 提示词
15
+
16
+ ```text
17
+ You are the director, motion designer, engineer and sound designer of ONE 10-second motion-design film.
18
+ The goal is the most classic, yet most stunning form of this style — award-shortlist / high-end commercial quality. A clean,
19
+ template-looking result is a fail. Benchmarks: Buck, ManvsMachine, Ordinary Folk, Giant Ant, Territory Studio, Apple keynote
20
+ motion, Pentagram motion identities, top Behance/Motionographer features, top 抖音/B站 designer accounts.
21
+
22
+ # Style
23
+ 像素风 Pixel Art / 8-bit
24
+
25
+ # Output (fixed)
26
+ - 1920×1080, 30 fps, exactly 10.000 s (300 frames), H.264 MP4 with stereo AAC audio (48 kHz), mastered to −14 LUFS
27
+ integrated, true peak ≤ −1 dBTP. Final file: video.mp4.
28
+
29
+ # Suggested technical route
30
+ HTML Canvas at 320×180 internal resolution, integer-scaled ×6 with nearest-neighbour; sprites authored as pixel arrays in code; limited palette
31
+ (You may choose a better route if it clearly raises quality; say why.)
32
+
33
+ # Creative seed
34
+ 「像素冒险 PIXEL QUEST」A retro side-scroller title/attract sequence.
35
+ - Internal 320×180, ×6 nearest-neighbour; limited palette (PICO-8-like 16–32 colours) with dithered sky gradient; 3–4 parallax layers (sky, far mountains, mid forest/city, near ground tiles) moving by whole pixels.
36
+ - Hero sprite (hand-authored 16×16–24×24, 6–8 frame run cycle at ~10–12 fps) runs, jumps, collects coins (sparkle), bops a slime; the palette shifts day → sunset; a treasure chest opens with a light burst.
37
+ - Dialogue box with pixel CJK font typing 「欢迎来到像素世界!」; chunky pixel logo "PIXEL QUEST" drops in with shine sweep; optional CRT pass (scanlines, slight barrel, phosphor glow) that doesn't blur pixels into mush.
38
+ - Strictly: nearest-neighbour, integer pixel positions, stepped timing (no smooth easing on sprites).
39
+ Sound: chiptune (pulse lead, triangle bass, noise drums) + jump/coin/chest SFX.
40
+
41
+ You are the director: you may change the concept, copy, story beats and brand names if you find a stronger idea, but the result must remain the CANONICAL, instantly-recognisable form of this style and must hit its signature features below.
42
+
43
+ # Signature features and key techniques (the result is judged against these)
44
+ 低分辨率大颗粒像素 + 有限色板 + 低帧率精灵动画的复古游戏美学,在 B 站游戏区(MC、泰拉瑞亚、独立游戏)、8-bit 音乐 MV 和品牌怀旧营销中常见;Aseprite 教程在 B 站有 10 万+ 播放的稳定学习生态。
45
+ 视觉特征 大颗粒像素与硬边缘, 有限色板(8~32色), 8~12fps 精灵帧动画, 抖动渐变 dithering, CRT 扫描线滤镜
46
+ 关键技法 Aseprite 绘制精灵表(sprite sheet)+ 序列帧循环(走路 6~8 帧、呼吸 2~4 帧)
47
+ 缩放必须最近邻插值(CSS image-rendering: pixelated),杜绝抗锯齿糊边
48
+ 动画用 steps() 阶梯时序而非平滑缓动,保持逐帧感
49
+ 视差卷轴背景:远中近三层不同速度整像素平移
50
+ 可选 CRT 后处理:扫描线+桶形畸变+磷光辉光
51
+
52
+ # How to work
53
+ 1. Treatment. Write down one clear idea: a hook in the first 0.5 s (never open on more than 0.3 s of empty or black), an
54
+ escalation, one unmistakable hero moment at ~60–75 % of the runtime, and a composed end frame held ~0.8–1.2 s with living
55
+ micro-motion. Map every signature feature above to a moment. Keep one cue sheet (beats and hit times) that both the
56
+ picture and the sound read from.
57
+ 2. Key frames before motion. Build the look, render stills at 6–10 key times and actually look at them. Each still should be
58
+ poster-worthy: composition, hierarchy, negative space, type set properly (kerning, line-height, weight contrast, CJK
59
+ punctuation, ~5 % safe margins). Iterate until nothing looks default, generic, cramped or "AI-template".
60
+ 3. Motion. Build the choreography and preview at low resolution. Step through the fastest moves frame by frame: spacing,
61
+ easing, arcs, overlap, anticipation and follow-through, motion blur. No unintended dead spans; the energy follows the music.
62
+ 4. Sound. Write genre-correct music and sound design locked to the cue sheet. Check that visual hits land on audio onsets.
63
+ Master to the output spec.
64
+ 5. Final. Render at full resolution (motion blur where apt), then check: exactly 10.00 s, resolution, fps, audio present and at
65
+ the right loudness, no black frames, no fallback fonts or tofu, no clipped elements at the frame edges, no shimmer on thin
66
+ lines, no gradient banding. Fix and repeat until you would submit it to a festival.
67
+ 6. Write an honest self-critique: what is strongest, what is weakest, what you would do with more time.
68
+
69
+ # Rules
70
+ - Rendering must be deterministic: every frame is a pure function of time t. Seeded randomness only; physics and particles
71
+ precomputed or closed-form; no real-time clocks; no state-triggered CSS transitions. A reliable route: a web page that can
72
+ draw any time t on request, captured frame by frame with a headless browser and encoded with ffmpeg (or a Blender script
73
+ that renders a PNG sequence).
74
+ - Assets: only CC0 / public domain / OFL / Apache / free-for-commercial-use. Record each source and licence in CREDITS.md.
75
+ No real brand trademarks; invent brand names.
76
+ - On-screen text must be correct and natural: idiomatic Chinese, proper CJK punctuation, no typos.
77
+
78
+ # Craft checklist (what a jury looks for)
79
+ - Style authenticity: an expert names the style in one second; every signature technique is present and executed correctly.
80
+ - Motion craft: purposeful easing (no linear unless mechanical by design), overlap and stagger, anticipation and
81
+ follow-through, arcs, squash and stretch where the style allows, consistent physics, motion blur where apt; transitions
82
+ carried by elements, not crossfades.
83
+ - Rhythm: hits locked to the music; contrast between busy and calm; no monotony.
84
+ - Design: strong composition, grid, typographic hierarchy, controlled palette; texture and finishing (grain, glow, vignette)
85
+ only where the style wants it; nothing looks accidental.
86
+ - Technical polish: no jitter (unless intended), no popping, no aliasing, no banding, no fallback fonts, no half-loaded images.
87
+ - Sound: genre-correct, musical, synced, mastered.
88
+
89
+ # Before you deliver, score yourself honestly
90
+ 1–10 on style fidelity, concept wow, motion craft, design & typography, finish & texture, sound & sync, technical
91
+ (6 = template-level, 8 = high-end agency, 9 = award shortlist). Aim for 9; fix whatever scores lowest first.
92
+
93
+ # Deliver
94
+ video.mp4, plus a short report: the concept in two sentences; a beat sheet with timecodes; how each signature feature is
95
+ realised; the tech route; check numbers (duration, resolution, fps, loudness, true peak); your honest top-3 weaknesses.
96
+ ```
@@ -0,0 +1,95 @@
1
+ # 赛博朋克 HUD / FUI Cyberpunk HUD / FUI (Fictional UI)
2
+
3
+ **原片**:隼眼-9 · 目标锁定 KESTREL-9 TARGET ACQUIRED · 1920×1080 · 30 fps · 10 秒 · AI 评审终评 7.93 / 10
4
+
5
+ **源码**:[demos/22-hud/](../demos/22-hud/)
6
+
7
+ ## 怎么用
8
+
9
+ 1. 新建一个空文件夹,在里面打开一个能写代码、能执行命令的 AI 助手(例如 Claude Code)。本机需要能跑网页渲染(Node + Chrome)和 ffmpeg。
10
+ 2. 把下面「提示词」整段复制进去发送。
11
+ 3. 想换成自己的内容:改 `Creative seed` 里的故事、品牌名、文案和配色,或者改 `Output` 里的尺寸(比如竖屏 1080×1920)。不要删 `Signature features` 那一段,它是这种风格被一眼认出来的依据。
12
+ 4. 想再提高:成片出来后,另开一个 AI 用 [rubric.md](../rubric.md) 评审,把评审意见贴回给制作的 AI 再改一轮。原片就是这样改了两轮。
13
+
14
+ ## 提示词
15
+
16
+ ```text
17
+ You are the director, motion designer, engineer and sound designer of ONE 10-second motion-design film.
18
+ The goal is the most classic, yet most stunning form of this style — award-shortlist / high-end commercial quality. A clean,
19
+ template-looking result is a fail. Benchmarks: Buck, ManvsMachine, Ordinary Folk, Giant Ant, Territory Studio, Apple keynote
20
+ motion, Pentagram motion identities, top Behance/Motionographer features, top 抖音/B站 designer accounts.
21
+
22
+ # Style
23
+ 赛博朋克 HUD / FUI Cyberpunk HUD / FUI (Fictional UI)
24
+
25
+ # Output (fixed)
26
+ - 1920×1080, 30 fps, exactly 10.000 s (300 frames), H.264 MP4 with stereo AAC audio (48 kHz), mastered to −14 LUFS
27
+ integrated, true peak ≤ −1 dBTP. Final file: video.mp4.
28
+
29
+ # Suggested technical route
30
+ HTML: SVG/Canvas FUI layers + Three.js wireframe hologram; seeded random data; glow/scanline post pass
31
+ (You may choose a better route if it clearly raises quality; say why.)
32
+
33
+ # Creative seed
34
+ 「目标锁定 TARGET ACQUIRED」Cyberpunk HUD / FUI, film-UI grade (Territory Studio-level density & restraint).
35
+ - Deep teal-black; cyan #00E5FF linework with orange/red #FF6A00 alert state; hex grid, concentric rotating rings with ticks, radar sweep (conic) with blips, data columns (monospace numbers rolling 3–5 frames then settling), typewriter status lines with cursor, sparkline graphs, a central Three.js wireframe hologram (globe or drone) with scanlines.
36
+ - Layered build-up: lines draw on in hierarchical staggered order → data comes alive → a target is found → lock brackets snap 1.4 → 1.0 (fast-out slow-in) → everything flips to alert orange with 'TARGET LOCKED / 目标锁定', coordinates "N31°14′ E121°29′".
37
+ - Glow, slight chromatic aberration, scanlines, restrained micro-glitches.
38
+ Sound: darksynth pulse + HUD beeps, scan sweeps, ascending lock-on tone, alarm on lock.
39
+
40
+ You are the director: you may change the concept, copy, story beats and brand names if you find a stronger idea, but the result must remain the CANONICAL, instantly-recognisable form of this style and must hit its signature features below.
41
+
42
+ # Signature features and key techniques (the result is judged against these)
43
+ 模拟科幻电影/游戏界面的抬头显示包装:青橙霓虹线框、目标锁定框、雷达扫描、数据流小字。在科技数码测评、游戏剪辑(赛博朋克2077、EVA 二创)、军事航天科普和 AI 产品演示中作为『科技感』的默认皮肤,B 站 AE HUD 案例教程播放量达 20 万。
44
+ 视觉特征 青色/橙色霓虹线框, 目标锁定框与十字准星, 雷达/环形扫描 loop, 等宽小字数据流与打字机文字, 六边形网格与辉光
45
+ 关键技法 线框生长:SVG stroke-dasharray/dashoffset 描边动画,元素按层级错帧展开
46
+ 环形雷达:conic-gradient 扫描扇区旋转 loop + 目标点闪烁
47
+ 数字滚动:随机数快速跳变 3~5 帧后落定真实值;文字打字机 + 光标闪烁
48
+ 锁定框:四角括号从大到小收缩吸附目标(scale 1.4→1.0 + 快出缓入)
49
+ 全局外发光(glow)+ 轻微色差 + 扫描线叠加统一质感
50
+
51
+ # How to work
52
+ 1. Treatment. Write down one clear idea: a hook in the first 0.5 s (never open on more than 0.3 s of empty or black), an
53
+ escalation, one unmistakable hero moment at ~60–75 % of the runtime, and a composed end frame held ~0.8–1.2 s with living
54
+ micro-motion. Map every signature feature above to a moment. Keep one cue sheet (beats and hit times) that both the
55
+ picture and the sound read from.
56
+ 2. Key frames before motion. Build the look, render stills at 6–10 key times and actually look at them. Each still should be
57
+ poster-worthy: composition, hierarchy, negative space, type set properly (kerning, line-height, weight contrast, CJK
58
+ punctuation, ~5 % safe margins). Iterate until nothing looks default, generic, cramped or "AI-template".
59
+ 3. Motion. Build the choreography and preview at low resolution. Step through the fastest moves frame by frame: spacing,
60
+ easing, arcs, overlap, anticipation and follow-through, motion blur. No unintended dead spans; the energy follows the music.
61
+ 4. Sound. Write genre-correct music and sound design locked to the cue sheet. Check that visual hits land on audio onsets.
62
+ Master to the output spec.
63
+ 5. Final. Render at full resolution (motion blur where apt), then check: exactly 10.00 s, resolution, fps, audio present and at
64
+ the right loudness, no black frames, no fallback fonts or tofu, no clipped elements at the frame edges, no shimmer on thin
65
+ lines, no gradient banding. Fix and repeat until you would submit it to a festival.
66
+ 6. Write an honest self-critique: what is strongest, what is weakest, what you would do with more time.
67
+
68
+ # Rules
69
+ - Rendering must be deterministic: every frame is a pure function of time t. Seeded randomness only; physics and particles
70
+ precomputed or closed-form; no real-time clocks; no state-triggered CSS transitions. A reliable route: a web page that can
71
+ draw any time t on request, captured frame by frame with a headless browser and encoded with ffmpeg (or a Blender script
72
+ that renders a PNG sequence).
73
+ - Assets: only CC0 / public domain / OFL / Apache / free-for-commercial-use. Record each source and licence in CREDITS.md.
74
+ No real brand trademarks; invent brand names.
75
+ - On-screen text must be correct and natural: idiomatic Chinese, proper CJK punctuation, no typos.
76
+
77
+ # Craft checklist (what a jury looks for)
78
+ - Style authenticity: an expert names the style in one second; every signature technique is present and executed correctly.
79
+ - Motion craft: purposeful easing (no linear unless mechanical by design), overlap and stagger, anticipation and
80
+ follow-through, arcs, squash and stretch where the style allows, consistent physics, motion blur where apt; transitions
81
+ carried by elements, not crossfades.
82
+ - Rhythm: hits locked to the music; contrast between busy and calm; no monotony.
83
+ - Design: strong composition, grid, typographic hierarchy, controlled palette; texture and finishing (grain, glow, vignette)
84
+ only where the style wants it; nothing looks accidental.
85
+ - Technical polish: no jitter (unless intended), no popping, no aliasing, no banding, no fallback fonts, no half-loaded images.
86
+ - Sound: genre-correct, musical, synced, mastered.
87
+
88
+ # Before you deliver, score yourself honestly
89
+ 1–10 on style fidelity, concept wow, motion craft, design & typography, finish & texture, sound & sync, technical
90
+ (6 = template-level, 8 = high-end agency, 9 = award shortlist). Aim for 9; fix whatever scores lowest first.
91
+
92
+ # Deliver
93
+ video.mp4, plus a short report: the concept in two sentences; a beat sheet with timecodes; how each signature feature is
94
+ realised; the tech route; check numbers (duration, resolution, fps, loudness, true peak); your honest top-3 weaknesses.
95
+ ```
@@ -0,0 +1,51 @@
1
+ # 评审提示词:让另一个 AI 当评委,再拿评审意见改一轮
2
+
3
+ 原片都是这样迭代出来的:制作 → 独立评审 → 按评审修改 → 再评审。下面两段提示词可以直接用。
4
+
5
+ ## 第一步:评审(另开一个 AI 会话,把成片路径告诉它)
6
+
7
+ ```text
8
+ You are a senior motion-design jury member (think: Motionographer editor, Buck/ManvsMachine creative director, a 抖音/B站
9
+ top design-account lead for the Chinese styles). You did NOT make this film. Judge it harshly and precisely so it can reach
10
+ award-level / high-end commercial quality. Kindness is useless here; specificity is everything.
11
+
12
+ The film: <path to video.mp4>. The prompt it was made from: <paste the style prompt, or at least its Style, Output and
13
+ Signature features sections>.
14
+
15
+ 1. Look at the film properly: extract a contact sheet (a frame every 0.5 s), filmstrips around the fastest and most
16
+ important moves and the hero moment, and full-resolution frames at 5–8 key times. Look at small details at full
17
+ resolution: edges, type setting, aliasing, banding, texture, clipping.
18
+ 2. Check the spec: exactly 10.00 s, resolution and fps as specified, audio present, loudness ≈ −14 LUFS (±1), true peak
19
+ ≤ −1 dBTP, no black frames except intended, no unintended static spans, visual hits aligned with audio onsets.
20
+ 3. Score 1–10 on each dimension (5 = competent student work; 6 = decent template level; 7 = solid professional; 8 = high-end
21
+ agency work; 9 = award shortlist; 10 = best in the world). Most first renders deserve 5–7. Do not inflate.
22
+ - style_fidelity: instantly recognisable canonical form; every signature feature and technique present and correct
23
+ - concept_wow: a clear idea, a hook in the first 0.5 s, an unmistakable hero moment, a satisfying end frame
24
+ - motion_craft: easing, spacing, overlap, anticipation and follow-through, arcs, transitions, motion blur; no dead or
25
+ jittery motion
26
+ - design_typography: composition, hierarchy, grid, type setting (CJK too), palette, negative space
27
+ - finish_texture: lighting, texture, grain, glow and detail appropriate to the style; no banding, aliasing or artifacts
28
+ - sound_sync: musicality, genre-correctness, sound design, sync to picture, mix and master
29
+ - technical: spec compliance, fonts loaded, no glitches, clipping or popping
30
+ 4. Give 5–10 fixes ordered by impact on the final impression. Each: timecode(s), what is wrong (observable), why it matters,
31
+ and a concrete how-to (technique and numbers: easing curve, frame counts, px, colours, font, layout change). Prefer a few
32
+ big upgrades over many nitpicks. At least one fix must raise the wow factor, not just polish.
33
+ 5. Flag as critical: anything that reads as generic or AI-template, unnatural Chinese copy, fallback fonts or tofu, and any
34
+ spec failure.
35
+ Return: the score table, the critical issues, and the fix list.
36
+ ```
37
+
38
+ ## 第二步:修改(回到制作的那个 AI 会话,把评审结果贴进去)
39
+
40
+ ```text
41
+ An independent jury reviewed your film. Here is the full review:
42
+ <paste the review>
43
+
44
+ Raise the film to award level (target ≥ 9 in every dimension):
45
+ - First keep a copy of the current video and source as version N.
46
+ - Implement every critical issue and every high-impact fix. You may substitute a better solution for a listed fix if you are
47
+ confident; say why. Go beyond the list where you see a bigger upgrade, especially for the wow factor. Do not regress
48
+ anything the jury listed as a strength.
49
+ - Re-render at full resolution, re-check the spec and look at the frames until the fixes have truly landed.
50
+ - Report which fixes you applied or skipped, and why.
51
+ ```
@@ -0,0 +1,36 @@
1
+ # 写一种新风格的提示词
2
+
3
+ 每份风格提示词都由「通用部分」和「风格专属部分」组成。通用部分(开头的角色设定,以及 How to work / Rules / Craft checklist /
4
+ 自评 / Deliver)所有风格都一样,可以直接从任意一份 `prompts/*.md` 里复制。要写一种新风格,只需要填下面四段:
5
+
6
+ ```text
7
+ # Style
8
+ <中文风格名 English style name>
9
+
10
+ # Output (fixed)
11
+ - <宽>×<高>, <帧率> fps, exactly 10.000 s, H.264 MP4 with stereo AAC audio (48 kHz), mastered to −14 LUFS integrated,
12
+ true peak ≤ −1 dBTP. Final file: video.mp4.
13
+
14
+ # Suggested technical route
15
+ <用什么做最合适:SVG/Canvas/WebGL/Three.js/Blender……以及关键实现手段。>
16
+ (You may choose a better route if it clearly raises quality; say why.)
17
+
18
+ # Creative seed
19
+ <「一句话片名」+ 这种风格最经典又最惊艳的读法:
20
+ - 0–X s 发生什么(钩子 → 升级 → 高潮 → 结尾画面),
21
+ - 配色(3–6 个具体色值),字体气质,
22
+ - Sound: 音乐风格 + 关键音效。>
23
+
24
+ You are the director: you may change the concept, copy, story beats and brand names if you find a stronger idea, but the
25
+ result must remain the CANONICAL, instantly-recognisable form of this style and must hit its signature features below.
26
+
27
+ # Signature features and key techniques (the result is judged against these)
28
+ <这种风格的来源和用途(一两句)>
29
+ 视觉特征 <逗号分隔的标志特征>
30
+ 关键技法 <可执行的技法,越具体越好:曲线参数、帧数、层结构……每条一行>
31
+ ```
32
+
33
+ 写好的关键:
34
+ - **Signature features 要可检验**。写「弹性缓动 overshoot 用 cubic-bezier(0.34,1.56,0.64,1),错峰 2–4 帧」,而不是「动效要有弹性」。
35
+ - **Creative seed 要有节拍**。按秒写出钩子、升级、高潮和结尾,AI 才不会做成平铺直叙的模板。
36
+ - **品牌名和文案用虚构的**,避免商标问题。
@@ -0,0 +1,198 @@
1
+ // 像素级画质检查:色带、抗锯齿、字体注册。
2
+ //
3
+ // 为什么要有:帧检(qa.js)看的是「有没有黑场 / 静止 / 越界」,回答不了
4
+ // 「这张脸是不是糊的」。而画质退化的两种最典型形态恰好都在像素层面:
5
+ // 1. 柔和渐变在 8bit 量化后裂成一级级的色带(淡紫底最容易中招);
6
+ // 2. 斜边没有抗锯齿,等轴场景的 30°/60° 边全成了台阶。
7
+ // 两者都要 1:1 的像素才能判,所以这里直接从成片里抠原始灰度字节来算,
8
+ // 不引入 sharp/jimp 之类的依赖(插件只有 ffmpeg)。
9
+
10
+ import { existsSync, readFileSync, readdirSync } from 'node:fs'
11
+ import { join, extname } from 'node:path'
12
+ import { runFfmpeg } from './ffmpeg.js'
13
+
14
+ const clampInt = (value, low, high) => Math.min(Math.max(Math.round(Number(value) || 0), low), high)
15
+
16
+ async function rawGray({ source, work, time, crop, name, timeoutMs }) {
17
+ const out = join(work, name + '.raw')
18
+ const filter = 'crop=' + crop.w + ':' + crop.h + ':' + crop.x + ':' + crop.y + ',format=gray'
19
+ await runFfmpeg(['-ss', String(Math.max(0, time)), '-i', source, '-frames:v', '1', '-vf', filter, '-f', 'rawvideo', out],
20
+ { cwd: work, log: name + '.log', timeoutMs: timeoutMs || 120000 })
21
+ if (!existsSync(out)) throw new Error('取不到像素:' + name)
22
+ return readFileSync(out)
23
+ }
24
+
25
+ // 色带:把一行像素切成「等值段」,再看是否出现连续多段、每段都不短、
26
+ // 且相邻段只差 1–2 级的「阶梯」。平涂色块是单段,真实渐变是长段少级差
27
+ // (有抖动时会被打碎),只有量化后的渐变才会长成 8px 以上、连十几段的梯子。
28
+ function staircase(row) {
29
+ const runs = []
30
+ for (let i = 0; i < row.length;) {
31
+ let end = i + 1
32
+ while (end < row.length && row[end] === row[i]) end += 1
33
+ runs.push({ value: row[i], length: end - i })
34
+ i = end
35
+ }
36
+ let longest = 0
37
+ let steps = 0
38
+ let current = 0
39
+ for (let index = 1; index < runs.length; index += 1) {
40
+ const previous = runs[index - 1]
41
+ const here = runs[index]
42
+ const delta = Math.abs(here.value - previous.value)
43
+ const flatEnough = previous.length >= 6 && previous.length <= 400 && here.length >= 6 && here.length <= 400
44
+ if (delta >= 1 && delta <= 2 && flatEnough) {
45
+ current = current ? current + 1 : 2
46
+ longest = Math.max(longest, current)
47
+ steps += 1
48
+ } else current = 0
49
+ }
50
+ return { longest, steps, runs: runs.length }
51
+ }
52
+
53
+ function sobelRatio(bytes, width, height) {
54
+ let mid = 0
55
+ let strong = 0
56
+ for (let y = 1; y < height - 1; y += 1) {
57
+ for (let x = 1; x < width - 1; x += 1) {
58
+ const i = y * width + x
59
+ const gx = -bytes[i - width - 1] - 2 * bytes[i - 1] - bytes[i + width - 1]
60
+ + bytes[i - width + 1] + 2 * bytes[i + 1] + bytes[i + width + 1]
61
+ const gy = -bytes[i - width - 1] - 2 * bytes[i - width] - bytes[i - width + 1]
62
+ + bytes[i + width - 1] + 2 * bytes[i + width] + bytes[i + width + 1]
63
+ const magnitude = (Math.abs(gx) + Math.abs(gy)) / 4
64
+ if (magnitude > 60) strong += 1
65
+ else if (magnitude > 8) mid += 1
66
+ }
67
+ }
68
+ const edge = mid + strong
69
+ return edge ? mid / edge : null
70
+ }
71
+
72
+ const GENERIC_FAMILIES = new Set(['serif', 'sans-serif', 'monospace', 'system-ui', 'ui-serif', 'ui-sans-serif',
73
+ 'ui-monospace', 'cursive', 'fantasy', 'emoji', 'math', 'fangsong', 'inherit', 'initial', 'unset', 'revert'])
74
+ const SOURCE_EXT = new Set(['.tsx', '.ts', '.jsx', '.js', '.css'])
75
+
76
+ function readSources(dir, depth = 0) {
77
+ const out = []
78
+ if (depth > 3) return out
79
+ let entries = []
80
+ try { entries = readdirSync(dir, { withFileTypes: true }) } catch { return out }
81
+ for (const entry of entries) {
82
+ if (entry.name === 'node_modules' || entry.name === '.out' || entry.name === 'assets') continue
83
+ const full = join(dir, entry.name)
84
+ if (entry.isDirectory()) { out.push(...readSources(full, depth + 1)); continue }
85
+ if (!SOURCE_EXT.has(extname(entry.name))) continue
86
+ try {
87
+ const text = readFileSync(full, 'utf8')
88
+ if (text.length < 400000) out.push({ file: full, text })
89
+ } catch { /* 读不了就跳过 */ }
90
+ }
91
+ return out
92
+ }
93
+
94
+ // 字体:场景里 declare 了一个字体,但工程没有 @font-face / loadFont / 字体文件,
95
+ // 浏览器就悄悄退回系统字体 —— 排版、字宽、甚至换行全变,这是最贵的降级。
96
+ // 给风格门禁用:把工程源码拼成一段文本,扫「有没有真的做后处理/累积」。
97
+ export function sourceText(dir, limit = 800000) {
98
+ let text = ''
99
+ for (const source of readSources(dir)) {
100
+ text += '\n/* ' + source.file + ' */\n' + source.text
101
+ if (text.length > limit) break
102
+ }
103
+ return text
104
+ }
105
+
106
+ export function checkFonts(dir) {
107
+ const sources = readSources(dir)
108
+ const familyPattern = /(?:fontFamily|font-family)\s*[:=]\s*['"`]([^'"`]+)['"`]|(?:loadFont|FontFace)\(\s*['"`]([^'"`]+)['"`]/g
109
+ const declared = new Set()
110
+ const registered = new Set()
111
+ const facePattern = /@font-face\s*\{([\s\S]*?)\}/g
112
+ const faceFamily = /font-family\s*:\s*['"]?([^'";}]+)/i
113
+ for (const { text } of sources) {
114
+ for (const match of text.matchAll(facePattern)) {
115
+ const family = faceFamily.exec(match[1])
116
+ if (family) registered.add(family[1].trim().toLowerCase())
117
+ }
118
+ for (const match of text.matchAll(/(?:loadFont|FontFace)\(\s*['"`]([^'"`]+)['"`]/g)) registered.add(match[1].trim().toLowerCase())
119
+ }
120
+ // 字体文件也可以直接说明「这个 family 是有的」:按去符号后的名字做包含匹配。
121
+ let fontFiles = []
122
+ const walk = (base, depth) => {
123
+ if (depth > 2) return
124
+ let entries = []
125
+ try { entries = readdirSync(base, { withFileTypes: true }) } catch { return }
126
+ for (const entry of entries) {
127
+ const full = join(base, entry.name)
128
+ if (entry.isDirectory()) { walk(full, depth + 1); continue }
129
+ if (/\.(ttf|otf|woff2?|TTF|OTF|WOFF2?)$/.test(entry.name)) fontFiles.push(entry.name.toLowerCase())
130
+ }
131
+ }
132
+ walk(join(dir, 'assets'), 0)
133
+ walk(dir, 0)
134
+ const normalize = (value) => value.toLowerCase().replace(/[^a-z0-9]/g, '')
135
+
136
+ for (const { file, text } of sources) {
137
+ for (const match of text.matchAll(familyPattern)) {
138
+ const family = (match[1] || match[2] || '').trim()
139
+ if (!family) continue
140
+ for (const single of family.split(',')) {
141
+ const name = single.trim().replace(/^['"`]|['"`]$/g, '').trim()
142
+ if (!name) continue
143
+ // 模板字面量(`${FAMILY}`)、CSS 变量、继承关键字都不是字体名:
144
+ // 把它们当"没注册的字体"会让字体门禁误拒,实测踩过。
145
+ if (/[${}()]/.test(name) || /^(?:inherit|initial|unset|revert|var|ui-)\b/i.test(name)) continue
146
+ const lower = name.toLowerCase()
147
+ if (GENERIC_FAMILIES.has(lower)) continue
148
+ declared.add(JSON.stringify({ name, file }))
149
+ }
150
+ }
151
+ }
152
+ const missing = []
153
+ const families = []
154
+ for (const entry of declared) {
155
+ const { name, file } = JSON.parse(entry)
156
+ const lower = name.toLowerCase()
157
+ if (families.includes(lower)) continue
158
+ families.push(lower)
159
+ const known = registered.has(lower) || fontFiles.some((font) => normalize(font).includes(normalize(name)) || normalize(name).includes(normalize(font.replace(/\.[a-z0-9]+$/, ''))))
160
+ if (!known) missing.push({ family: name, file })
161
+ }
162
+ return { families, missing, fontFiles, registered: [...registered] }
163
+ }
164
+
165
+ export async function pixelQuality({ source, work, timeline, dir, samples = 3, timeoutMs }) {
166
+ const width = Number(timeline?.width) || 1920
167
+ const height = Number(timeline?.height) || 1080
168
+ const fps = Number(timeline?.fps) || 30
169
+ const total = Number(timeline?.durationInFrames) || 300
170
+ const points = []
171
+ for (let index = 0; index < Math.max(1, samples); index += 1) {
172
+ const fraction = samples <= 1 ? 0.5 : 0.2 + (0.65 * index) / (samples - 1)
173
+ points.push(Math.min(total - 1, Math.max(0, Math.floor(total * fraction))) / fps)
174
+ }
175
+ const banding = []
176
+ for (const [index, time] of points.entries()) {
177
+ for (const fraction of [0.18, 0.5, 0.82]) {
178
+ const y = clampInt(height * fraction, 0, height - 1)
179
+ const row = await rawGray({ source, work, time, crop: { x: 0, y, w: width, h: 1 }, name: 'band-' + index + '-' + Math.round(fraction * 100), timeoutMs })
180
+ banding.push({ time: Math.round(time * 100) / 100, y, ...staircase(row) })
181
+ }
182
+ }
183
+ const bandingWorst = banding.reduce((worst, item) => (item.longest > (worst?.longest || 0) ? item : worst), null)
184
+ const aa = []
185
+ for (const [index, time] of points.entries()) {
186
+ const size = Math.min(480, width, height)
187
+ const crop = { x: clampInt((width - size) / 2, 0, width - size), y: clampInt((height - size) / 2, 0, height - size), w: size, h: size }
188
+ const bytes = await rawGray({ source, work, time, crop, name: 'aa-' + index, timeoutMs })
189
+ aa.push({ time: Math.round(time * 100) / 100, midRatio: sobelRatio(bytes, crop.w, crop.h) })
190
+ }
191
+ const ratios = aa.map((item) => item.midRatio).filter((value) => value !== null)
192
+ const aaAverage = ratios.length ? ratios.reduce((sum, value) => sum + value, 0) / ratios.length : null
193
+ return {
194
+ banding: { samples: banding, worst: bandingWorst },
195
+ aa: { samples: aa, average: aaAverage === null ? null : Math.round(aaAverage * 1000) / 1000 },
196
+ fonts: dir ? checkFonts(dir) : { families: [], missing: [], fontFiles: [] },
197
+ }
198
+ }
@@ -0,0 +1,97 @@
1
+ // 预览:把"某几帧长什么样"变成一张能直接看见的拼图。
2
+ //
3
+ // 这是整个改造里最重要的一条:以前 image_view 只返回路径,模型看不见图,
4
+ // 于是要花一整轮工具调用来"取图",34 次就是 34 个回合。现在预览工具
5
+ // 直接返回 {type:'image', attachment},同一轮就能判断画面对不对。
6
+
7
+ import { existsSync, mkdirSync, readdirSync, copyFileSync, rmSync, statSync } from 'node:fs'
8
+ import { join } from 'node:path'
9
+ import { createHash } from 'node:crypto'
10
+ import { execFile } from 'node:child_process'
11
+ import { promisify } from 'node:util'
12
+ import { ensureFfmpeg } from '../ffmpeg-manager.js'
13
+ import { renderProject, outputPath } from './render.js'
14
+ import { readTimeline } from './project.js'
15
+
16
+ const exec = promisify(execFile)
17
+
18
+ export function previewDir(dir) {
19
+ return join(dir, '.out', 'preview')
20
+ }
21
+
22
+ // 把已经渲染好的 PNG 拼成一张图。用 ffmpeg 的 tile,避免引入新依赖。
23
+ export async function contactSheet(images, options = {}) {
24
+ if (!images.length) throw new Error('没有可拼的帧')
25
+ const cols = Math.max(1, Math.min(4, Math.round(Number(options.cols) || 3)))
26
+ const rows = Math.ceil(images.length / cols)
27
+ const work = dirnameOf(images[0]) + '\\.sheet-' + createHash('sha1').update(images.join('|')).digest('hex').slice(0, 10)
28
+ mkdirSync(work, { recursive: true })
29
+ try {
30
+ images.forEach((file, index) => copyFileSync(file, join(work, 'frame-' + (index + 1) + '.png')))
31
+ const output = join(work, 'sheet.png')
32
+ // width:0 = 不缩放。1:1 看锯齿/色带时必须关掉缩放,否则锯齿先被重采样抹平了。
33
+ const width = options.width === undefined ? 640 : Number(options.width)
34
+ const filter = (width > 0 ? 'scale=' + width + ':-2:flags=lanczos,' : '')
35
+ + 'tile=' + cols + 'x' + rows + ':padding=8:margin=8:color=0x101010'
36
+ const binary = await ensureFfmpeg()
37
+ await exec(binary, ['-hide_banner', '-loglevel', 'error', '-y', '-i', join(work, 'frame-%d.png'),
38
+ '-frames:v', '1', '-vf', filter, output],
39
+ { windowsHide: true, timeout: 60000 })
40
+ if (!existsSync(output)) throw new Error('拼图失败')
41
+ return output
42
+ } finally {
43
+ for (const file of readdirSync(work)) if (file !== 'sheet.png') rmSync(join(work, file), { force: true })
44
+ }
45
+ }
46
+
47
+ function dirnameOf(file) {
48
+ const index = Math.max(file.lastIndexOf('\\'), file.lastIndexOf('/'))
49
+ return index > 0 ? file.slice(0, index) : '.'
50
+ }
51
+
52
+ async function cropFile(file, crop) {
53
+ const out = file.replace(/\.png$/i, '-crop.png')
54
+ const binary = await ensureFfmpeg()
55
+ await exec(binary, ['-hide_banner', '-loglevel', 'error', '-y', '-i', file,
56
+ '-vf', 'crop=' + crop.w + ':' + crop.h + ':' + crop.x + ':' + crop.y, out], { windowsHide: true, timeout: 60000 })
57
+ return existsSync(out) ? out : file
58
+ }
59
+
60
+ // 裁切参数归一化:给的中心点/宽高可能越界,先按工程尺寸夹住。
61
+ // 只给中心点(cx/cy)也行,默认取画面 1/3 大小 —— 局部的默认值就该够看细节。
62
+ export function normalizeCrop(crop, timeline) {
63
+ if (!crop || typeof crop !== 'object') return null
64
+ const width = Number(timeline?.width) || 1920
65
+ const height = Number(timeline?.height) || 1080
66
+ const clamp = (value, low, high) => Math.min(Math.max(Math.round(Number(value) || 0), low), high)
67
+ const w = clamp(crop.w || width / 3, 16, width)
68
+ const h = clamp(crop.h || height / 3, 16, height)
69
+ const x = clamp(crop.x !== undefined ? crop.x : (Number(crop.cx) || width / 2) - w / 2, 0, width - w)
70
+ const y = clamp(crop.y !== undefined ? crop.y : (Number(crop.cy) || height / 2) - h / 2, 0, height - h)
71
+ return { x, y, w, h }
72
+ }
73
+
74
+ // 渲染 + 拼图 + 转附件,一次做完。
75
+ // 返回的 attachment 由调用方的 render() 拼成 {type:'image', attachment} 内容块。
76
+ export async function previewProject(dir, options = {}) {
77
+ const frames = options.frames
78
+ if (!Array.isArray(frames) || !frames.length) throw new Error('frames 必填,例如 [0, 60, 120]')
79
+ const result = await renderProject(dir, { operation: 'still', frames, onProgress: options.onProgress }).promise
80
+ let rendered = (result.frames || []).map((item) => item.filename ? join(dir, '.out', 'qa', item.filename) : null).filter(Boolean)
81
+ if (!rendered.length) throw new Error('没有渲染出可预览的帧')
82
+ const crop = normalizeCrop(options.crop, readTimeline(dir))
83
+ if (crop) rendered = await Promise.all(rendered.map((file) => cropFile(file, crop)))
84
+ const sheet = await contactSheet(rendered, { cols: options.cols, width: crop ? 0 : 640 })
85
+ const bytes = await import('node:fs').then((fs) => fs.readFileSync(sheet))
86
+ const attachments = options.attachments
87
+ const attachment = attachments?.saveImage
88
+ ? await attachments.saveImage({ data: bytes, mediaType: 'image/png', name: 'preview-' + Date.now() + '.png' })
89
+ : undefined
90
+ return {
91
+ frames: rendered.map((file, index) => ({ frame: Number(frames[index]), file, bytes: statSync(file).size })),
92
+ sheet,
93
+ crop,
94
+ attachment,
95
+ output: outputPath(dir, 'preview.png'),
96
+ }
97
+ }