dsh-drawai 0.3.4 → 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.
- package/LICENSE +4142 -0
- package/README.md +43 -10
- package/lib/audio-media.js +147 -0
- package/lib/audio-service.js +66 -0
- package/lib/canvas-format.js +134 -0
- package/lib/client.js +5075 -181
- package/lib/comfyui-default-workflow.mjs +1825 -0
- package/lib/comfyui-workflow.mjs +426 -0
- package/lib/document-commands.js +12 -0
- package/lib/document-core.js +29 -0
- package/lib/drawing-tasks.js +26 -0
- package/lib/imagegen.mjs +596 -0
- package/lib/index.js +1758 -129
- package/lib/media.js +26 -13
- package/lib/mgstyle-core.js +75 -0
- package/lib/motion/apply.js +180 -0
- package/lib/motion/asset-pack-lock.js +10 -0
- package/lib/motion/asset-pack.js +335 -0
- package/lib/motion/assets.js +290 -0
- package/lib/motion/audio.js +103 -0
- package/lib/motion/audiolevel.js +63 -0
- package/lib/motion/audiomix.js +144 -0
- package/lib/motion/beats.js +337 -0
- package/lib/motion/builtin-assets.js +62 -0
- package/lib/motion/canvas-spec.js +442 -0
- package/lib/motion/capture.js +95 -0
- package/lib/motion/cards.js +80 -0
- package/lib/motion/collect.js +447 -0
- package/lib/motion/delivery.js +112 -0
- package/lib/motion/edge-speech.py +90 -0
- package/lib/motion/entry.jsx +73 -0
- package/lib/motion/export.js +200 -0
- package/lib/motion/ffmpeg.js +42 -0
- package/lib/motion/fonts.js +71 -0
- package/lib/motion/jobs.js +113 -0
- package/lib/motion/json.js +4 -0
- package/lib/motion/media-catalog.js +59 -0
- package/lib/motion/mgstyles/BRIEF-TEMPLATE.md +63 -0
- package/lib/motion/mgstyles/briefs/01-flat-vector.md +104 -0
- package/lib/motion/mgstyles/briefs/02-line-art.md +97 -0
- package/lib/motion/mgstyles/briefs/03-isometric.md +108 -0
- package/lib/motion/mgstyles/briefs/05-cel-boil.md +145 -0
- package/lib/motion/mgstyles/briefs/06-collage.md +149 -0
- package/lib/motion/mgstyles/briefs/07-liquid.md +106 -0
- package/lib/motion/mgstyles/briefs/08-morph.md +111 -0
- package/lib/motion/mgstyles/briefs/09-bauhaus.md +150 -0
- package/lib/motion/mgstyles/briefs/10-synthwave.md +151 -0
- package/lib/motion/mgstyles/briefs/12-aurora-glass.md +147 -0
- package/lib/motion/mgstyles/briefs/18-hanazi.md +140 -0
- package/lib/motion/mgstyles/briefs/19-paperclip.md +156 -0
- package/lib/motion/mgstyles/briefs/20-pixel.md +118 -0
- package/lib/motion/mgstyles/briefs/22-hud.md +118 -0
- package/lib/motion/mgstyles/catalog.d/01-flat-vector.json +34 -0
- package/lib/motion/mgstyles/catalog.d/02-line-art.json +34 -0
- package/lib/motion/mgstyles/catalog.d/03-isometric.json +35 -0
- package/lib/motion/mgstyles/catalog.d/05-cel-boil.json +28 -0
- package/lib/motion/mgstyles/catalog.d/06-collage.json +28 -0
- package/lib/motion/mgstyles/catalog.d/07-liquid.json +28 -0
- package/lib/motion/mgstyles/catalog.d/08-morph.json +28 -0
- package/lib/motion/mgstyles/catalog.d/09-bauhaus.json +28 -0
- package/lib/motion/mgstyles/catalog.d/10-synthwave.json +28 -0
- package/lib/motion/mgstyles/catalog.d/12-aurora-glass.json +28 -0
- package/lib/motion/mgstyles/catalog.d/18-hanazi.json +28 -0
- package/lib/motion/mgstyles/catalog.d/19-paperclip.json +28 -0
- package/lib/motion/mgstyles/catalog.d/20-pixel.json +28 -0
- package/lib/motion/mgstyles/catalog.d/22-hud.json +28 -0
- package/lib/motion/mgstyles/catalog.json +1356 -0
- package/lib/motion/mgstyles/upstream/README.md +147 -0
- package/lib/motion/mgstyles/upstream/README.zh-CN.md +147 -0
- package/lib/motion/mgstyles/upstream/demos/01-flat-vector/cues.json +1 -0
- package/lib/motion/mgstyles/upstream/demos/01-flat-vector/index.html +712 -0
- package/lib/motion/mgstyles/upstream/demos/02-line-art/cues.json +331 -0
- package/lib/motion/mgstyles/upstream/demos/02-line-art/film.js +676 -0
- package/lib/motion/mgstyles/upstream/demos/02-line-art/index.html +18 -0
- package/lib/motion/mgstyles/upstream/demos/02-line-art/tools/dump_timing.mjs +26 -0
- package/lib/motion/mgstyles/upstream/demos/03-isometric/cues.json +109 -0
- package/lib/motion/mgstyles/upstream/demos/03-isometric/index.html +25 -0
- package/lib/motion/mgstyles/upstream/demos/03-isometric/js/anim.js +82 -0
- package/lib/motion/mgstyles/upstream/demos/03-isometric/js/main.js +219 -0
- package/lib/motion/mgstyles/upstream/demos/03-isometric/js/night5.js +180 -0
- package/lib/motion/mgstyles/upstream/demos/03-isometric/js/render.js +202 -0
- package/lib/motion/mgstyles/upstream/demos/03-isometric/js/title.js +167 -0
- package/lib/motion/mgstyles/upstream/demos/03-isometric/js/title5.js +294 -0
- package/lib/motion/mgstyles/upstream/demos/03-isometric/js/ui.js +141 -0
- package/lib/motion/mgstyles/upstream/demos/03-isometric/js/world.js +1399 -0
- package/lib/motion/mgstyles/upstream/demos/05-cel-boil/cues.json +157 -0
- package/lib/motion/mgstyles/upstream/demos/05-cel-boil/index.html +34 -0
- package/lib/motion/mgstyles/upstream/demos/05-cel-boil/js/engine.js +326 -0
- package/lib/motion/mgstyles/upstream/demos/05-cel-boil/js/scene.js +2036 -0
- package/lib/motion/mgstyles/upstream/demos/06-collage/assets/gen/layout.json +157 -0
- package/lib/motion/mgstyles/upstream/demos/06-collage/cues.json +80 -0
- package/lib/motion/mgstyles/upstream/demos/06-collage/index.html +889 -0
- package/lib/motion/mgstyles/upstream/demos/07-liquid/cues.json +100 -0
- package/lib/motion/mgstyles/upstream/demos/07-liquid/index.html +108 -0
- package/lib/motion/mgstyles/upstream/demos/07-liquid/js/engine.js +153 -0
- package/lib/motion/mgstyles/upstream/demos/07-liquid/js/links.js +64 -0
- package/lib/motion/mgstyles/upstream/demos/07-liquid/js/lookdev.js +46 -0
- package/lib/motion/mgstyles/upstream/demos/07-liquid/js/scene.js +963 -0
- package/lib/motion/mgstyles/upstream/demos/07-liquid/js/shaders.js +647 -0
- package/lib/motion/mgstyles/upstream/demos/07-liquid/js/textsdf.js +114 -0
- package/lib/motion/mgstyles/upstream/demos/07-liquid/js/type.js +50 -0
- package/lib/motion/mgstyles/upstream/demos/08-morph/cues.json +131 -0
- package/lib/motion/mgstyles/upstream/demos/08-morph/glyphs.json +1 -0
- package/lib/motion/mgstyles/upstream/demos/08-morph/index.html +901 -0
- package/lib/motion/mgstyles/upstream/demos/09-bauhaus/cues.json +270 -0
- package/lib/motion/mgstyles/upstream/demos/09-bauhaus/film.js +697 -0
- package/lib/motion/mgstyles/upstream/demos/09-bauhaus/index.html +12 -0
- package/lib/motion/mgstyles/upstream/demos/10-synthwave/cues.json +44 -0
- package/lib/motion/mgstyles/upstream/demos/10-synthwave/index.html +1028 -0
- package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/cues.json +67 -0
- package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/index.html +16 -0
- package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/main.js +967 -0
- package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/shaders.js +468 -0
- package/lib/motion/mgstyles/upstream/demos/18-hanazi/cues.json +117 -0
- package/lib/motion/mgstyles/upstream/demos/18-hanazi/index.html +541 -0
- package/lib/motion/mgstyles/upstream/demos/19-paperclip/assets/countries-110m.json +1 -0
- package/lib/motion/mgstyles/upstream/demos/19-paperclip/assets/stickers/meta.json +34 -0
- package/lib/motion/mgstyles/upstream/demos/19-paperclip/cues.json +285 -0
- package/lib/motion/mgstyles/upstream/demos/19-paperclip/index.html +599 -0
- package/lib/motion/mgstyles/upstream/demos/20-pixel/cues.json +42 -0
- package/lib/motion/mgstyles/upstream/demos/20-pixel/film.js +914 -0
- package/lib/motion/mgstyles/upstream/demos/20-pixel/index.html +18 -0
- package/lib/motion/mgstyles/upstream/demos/22-hud/cues.json +108 -0
- package/lib/motion/mgstyles/upstream/demos/22-hud/index.html +125 -0
- package/lib/motion/mgstyles/upstream/demos/22-hud/js/holo.js +275 -0
- package/lib/motion/mgstyles/upstream/demos/22-hud/js/hud.js +855 -0
- package/lib/motion/mgstyles/upstream/demos/22-hud/js/post.js +150 -0
- package/lib/motion/mgstyles/upstream/demos/22-hud/js/util.js +65 -0
- package/lib/motion/mgstyles/upstream/demos/22-hud/js/v5.js +142 -0
- package/lib/motion/mgstyles/upstream/harness/render.mjs +319 -0
- package/lib/motion/mgstyles/upstream/manifest.json +269 -0
- package/lib/motion/mgstyles/upstream/prompts/01-flat-vector.md +98 -0
- package/lib/motion/mgstyles/upstream/prompts/02-line-art.md +95 -0
- package/lib/motion/mgstyles/upstream/prompts/03-isometric.md +97 -0
- package/lib/motion/mgstyles/upstream/prompts/05-cel-boil.md +95 -0
- package/lib/motion/mgstyles/upstream/prompts/06-collage.md +95 -0
- package/lib/motion/mgstyles/upstream/prompts/07-liquid.md +98 -0
- package/lib/motion/mgstyles/upstream/prompts/08-morph.md +95 -0
- package/lib/motion/mgstyles/upstream/prompts/09-bauhaus.md +96 -0
- package/lib/motion/mgstyles/upstream/prompts/10-synthwave.md +95 -0
- package/lib/motion/mgstyles/upstream/prompts/12-aurora-glass.md +96 -0
- package/lib/motion/mgstyles/upstream/prompts/18-hanazi.md +95 -0
- package/lib/motion/mgstyles/upstream/prompts/19-paperclip.md +96 -0
- package/lib/motion/mgstyles/upstream/prompts/20-pixel.md +96 -0
- package/lib/motion/mgstyles/upstream/prompts/22-hud.md +95 -0
- package/lib/motion/mgstyles/upstream/rubric.md +51 -0
- package/lib/motion/mgstyles/upstream/template.md +36 -0
- package/lib/motion/pixelqa.js +198 -0
- package/lib/motion/preview.js +95 -0
- package/lib/motion/project.js +395 -0
- package/lib/motion/qa.js +290 -0
- package/lib/motion/reference-media.jsx +10 -0
- package/lib/motion/render-settings.js +112 -0
- package/lib/motion/render.js +159 -0
- package/lib/motion/scene-kit.js +183 -0
- package/lib/motion/sfx.js +232 -0
- package/lib/motion/shotcraft/ClipCard.tsx +204 -0
- package/lib/motion/shotcraft/catalog.json +2461 -0
- package/lib/motion/shotcraft/upstream/SKILL.md +286 -0
- package/lib/motion/shotcraft/upstream/assets/lib/Caption.tsx +54 -0
- package/lib/motion/shotcraft/upstream/assets/lib/ClipCard.tsx +200 -0
- package/lib/motion/shotcraft/upstream/assets/lib/DigitRoll.tsx +45 -0
- package/lib/motion/shotcraft/upstream/assets/lib/FlashCut.tsx +20 -0
- package/lib/motion/shotcraft/upstream/assets/lib/FlatPanel.tsx +65 -0
- package/lib/motion/shotcraft/upstream/assets/lib/PageCam.tsx +151 -0
- package/lib/motion/shotcraft/upstream/assets/lib/VerticalTicker.tsx +129 -0
- package/lib/motion/shotcraft/upstream/assets/lib/helpers/camera.tsx +75 -0
- package/lib/motion/shotcraft/upstream/assets/lib/helpers/motion.ts +40 -0
- package/lib/motion/shotcraft/upstream/assets/lib/helpers/rand.ts +11 -0
- package/lib/motion/shotcraft/upstream/assets/lib/helpers/shake.ts +10 -0
- package/lib/motion/shotcraft/upstream/assets/scripts/__pycache__/sfx-source.cpython-313.pyc +0 -0
- package/lib/motion/shotcraft/upstream/assets/scripts/build-readme-cover.mjs +49 -0
- package/lib/motion/shotcraft/upstream/assets/scripts/capture-template.mjs +210 -0
- package/lib/motion/shotcraft/upstream/assets/scripts/sfx-source.py +423 -0
- package/lib/motion/shotcraft/upstream/assets/scripts/smoke-render-demos.py +170 -0
- package/lib/motion/shotcraft/upstream/assets/scripts/test_sfx_source.py +157 -0
- package/lib/motion/shotcraft/upstream/demos/README.md +120 -0
- package/lib/motion/shotcraft/upstream/demos/_fixtures/Brand.tsx +112 -0
- package/lib/motion/shotcraft/upstream/demos/_fixtures/Fixtures.tsx +647 -0
- package/lib/motion/shotcraft/upstream/demos/_fixtures/Look.tsx +316 -0
- package/lib/motion/shotcraft/upstream/demos/_fixtures/Motion.tsx +82 -0
- package/lib/motion/shotcraft/upstream/demos/_fixtures/PageCam2D.tsx +115 -0
- package/lib/motion/shotcraft/upstream/demos/_fixtures/Polish.tsx +243 -0
- package/lib/motion/shotcraft/upstream/demos/_textures/live-layout.json +389 -0
- package/lib/motion/shotcraft/upstream/demos/camera/basic-3d-scene/Basic3DScene.tsx +250 -0
- package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashImpactReal.tsx +305 -0
- package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashZoomReal.tsx +246 -0
- package/lib/motion/shotcraft/upstream/demos/camera/cursor-flyover/CursorFlyover.tsx +390 -0
- package/lib/motion/shotcraft/upstream/demos/camera/depth-layer-moves/MultiplaneReal.tsx +138 -0
- package/lib/motion/shotcraft/upstream/demos/camera/graze-face-tour/GrazeFaceTour.tsx +542 -0
- package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/OverheadTabletopDrop.tsx +315 -0
- package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/TiltReveal.tsx +299 -0
- package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/DroneDiveLanding.tsx +173 -0
- package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/ExplodedView.tsx +348 -0
- package/lib/motion/shotcraft/upstream/demos/camera/steep-tilt-glide/SteepTiltGlide.tsx +366 -0
- package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx +279 -0
- package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/PullBackIsolation.tsx +184 -0
- package/lib/motion/shotcraft/upstream/demos/camera/terminal-3d/Terminal3D.tsx +390 -0
- package/lib/motion/shotcraft/upstream/demos/data/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +155 -0
- package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/AxisRescaleShockV2.tsx +303 -0
- package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/OscilloscopeStreamV2.tsx +290 -0
- package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/UnitDotSwarmRegroupV2.tsx +278 -0
- package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/NeedleSweepSelftest.tsx +307 -0
- package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/TapeScrollFixedPointer.tsx +215 -0
- package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/BrakeReticleLock.tsx +299 -0
- package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/ChangelogScrollBrake.tsx +232 -0
- package/lib/motion/shotcraft/upstream/demos/data/timeline-travel/TimelineTravel.tsx +290 -0
- package/lib/motion/shotcraft/upstream/demos/effects/assemble-then-type-flyin/AssembleThenTypeFlyin.tsx +273 -0
- package/lib/motion/shotcraft/upstream/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx +167 -0
- package/lib/motion/shotcraft/upstream/demos/effects/brand-frame-snap/BrandFrameSnap.tsx +536 -0
- package/lib/motion/shotcraft/upstream/demos/effects/fui-hud-moves/ReticleLockOn.tsx +164 -0
- package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/FlylineArc.tsx +175 -0
- package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/GlowOrbAmbient.tsx +197 -0
- package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/OrbFlylineRelay.tsx +241 -0
- package/lib/motion/shotcraft/upstream/demos/effects/icon-performance-moves/AttentionBounce.tsx +279 -0
- package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/AnimeImpact.tsx +230 -0
- package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/HitCounter.tsx +345 -0
- package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SheenSweepRetry.tsx +275 -0
- package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SpotlightSweepReveal.tsx +229 -0
- package/lib/motion/shotcraft/upstream/demos/effects/radial-ripple-phone-chips/RadialRipplePhoneChips.tsx +312 -0
- package/lib/motion/shotcraft/upstream/demos/effects/riso-print-hits/RisoMisregistrationHit.tsx +222 -0
- package/lib/motion/shotcraft/upstream/demos/effects/scan-bracket-sweep/ScanBracketSweep.tsx +295 -0
- package/lib/motion/shotcraft/upstream/demos/effects/scanline-annotate-focus/ScanlineAnnotateFocus.tsx +329 -0
- package/lib/motion/shotcraft/upstream/demos/effects/scanline-assemble-flyin/ScanlineAssembleFlyin.tsx +315 -0
- package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ImpactBurstKit.tsx +264 -0
- package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/KanadaPerspectiveSnap.tsx +260 -0
- package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ScoreSlam.tsx +263 -0
- package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/CornerSpotlightReveal.tsx +123 -0
- package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +187 -0
- package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/SlideSpotlightPan.tsx +175 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/autolayout-gap-dial/AutolayoutGapDial.tsx +305 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/DiagramCascadeBuild.tsx +350 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +352 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/chip-grid-single-select-blackout/ChipGridSingleSelectBlackout.tsx +218 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/collab-cursor-moves/CursorCastEnsemble.tsx +297 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/glass-pill-dictation-typing/GlassPillDictationTyping.tsx +157 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +218 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/picker-carousel-feature-cycle/PickerCarouselFeatureCycle.tsx +202 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/segmented-thumb-hero/SegmentedThumbHero.tsx +265 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/PaletteThemeRipple.tsx +457 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/ThemeSweepToggle.tsx +446 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/type-and-filter/TypeAndFilter.tsx +249 -0
- package/lib/motion/shotcraft/upstream/demos/interaction/voice-waveform-live/VoiceWaveformLive.tsx +278 -0
- package/lib/motion/shotcraft/upstream/demos/opening/crane-rise-reveal/CraneRiseReveal.tsx +332 -0
- package/lib/motion/shotcraft/upstream/demos/opening/dataviz-landscape-open/DatavizLandscapeOpen.tsx +358 -0
- package/lib/motion/shotcraft/upstream/demos/opening/fracture/Fracture.tsx +201 -0
- package/lib/motion/shotcraft/upstream/demos/opening/icon-field-colorize/IconFieldColorize.tsx +200 -0
- package/lib/motion/shotcraft/upstream/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx +208 -0
- package/lib/motion/shotcraft/upstream/demos/opening/magician-card-flourish/MagicianCardFlourish.tsx +341 -0
- package/lib/motion/shotcraft/upstream/demos/opening/orbit-ring-title-open/OrbitRingTitleOpen.tsx +389 -0
- package/lib/motion/shotcraft/upstream/demos/opening/spotlight-hero-card/SpotlightHeroCard.tsx +293 -0
- package/lib/motion/shotcraft/upstream/demos/opening/stroke-segment-build/StrokeSegmentBuild.tsx +183 -0
- package/lib/motion/shotcraft/upstream/demos/opening/text-as-mask/TextAsMask.tsx +245 -0
- package/lib/motion/shotcraft/upstream/demos/outro/grain-dissolve/GrainDissolve.tsx +222 -0
- package/lib/motion/shotcraft/upstream/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx +223 -0
- package/lib/motion/shotcraft/upstream/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx +217 -0
- package/lib/motion/shotcraft/upstream/demos/outro/outro-group-photo-launch/OutroGroupPhotoLaunch.tsx +343 -0
- package/lib/motion/shotcraft/upstream/demos/outro/ui-strip-away-outro/UiStripAwayOutro.tsx +357 -0
- package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/IconFlipBloomLogo.tsx +187 -0
- package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/InputMorphsIntoLogo.tsx +333 -0
- package/lib/motion/shotcraft/upstream/demos/rhythm/beat-cut-moves/PaparazziFlash.tsx +274 -0
- package/lib/motion/shotcraft/upstream/demos/rhythm/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +270 -0
- package/lib/motion/shotcraft/upstream/demos/rhythm/panel-grid-moves/ComicPanelSplit.tsx +430 -0
- package/lib/motion/shotcraft/upstream/demos/rhythm/quad-split-parallel-scenes/QuadSplitParallelScenes.tsx +252 -0
- package/lib/motion/shotcraft/upstream/demos/rhythm/rhythm-interrupt-moves/JumpCutPunchIn.tsx +106 -0
- package/lib/motion/shotcraft/upstream/demos/rhythm/sakuga-timing-shift/SakugaTimingShift.tsx +288 -0
- package/lib/motion/shotcraft/upstream/demos/rhythm/speed-ramp-freeze/FreezeAnnotateReal.tsx +362 -0
- package/lib/motion/shotcraft/upstream/demos/rhythm/trailer-grammar-moves/TrailerBumper.tsx +168 -0
- package/lib/motion/shotcraft/upstream/demos/transition/bottom-push-stack-wipe/BottomPushStackWipe.tsx +310 -0
- package/lib/motion/shotcraft/upstream/demos/transition/card-flip-reveal/CardFlipReveal.tsx +261 -0
- package/lib/motion/shotcraft/upstream/demos/transition/card-flock-tumble/CardFlockTumble.tsx +459 -0
- package/lib/motion/shotcraft/upstream/demos/transition/circle-match-iris/CircleMatchIris.tsx +294 -0
- package/lib/motion/shotcraft/upstream/demos/transition/gradient-transition/GradientTransition.tsx +161 -0
- package/lib/motion/shotcraft/upstream/demos/transition/line-carry-transition/LineCarryTransition.tsx +248 -0
- package/lib/motion/shotcraft/upstream/demos/transition/mosaic-reframe/MosaicReframe.tsx +359 -0
- package/lib/motion/shotcraft/upstream/demos/transition/page-turn-transitions/BarnDoorSplit.tsx +227 -0
- package/lib/motion/shotcraft/upstream/demos/transition/print-texture-transitions/InkBleedReveal.tsx +162 -0
- package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/PortalWipeV2.tsx +248 -0
- package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/WhipBrakeReal.tsx +186 -0
- package/lib/motion/shotcraft/upstream/demos/transition/tear-streak-transitions/GlitchDisplace.tsx +355 -0
- package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/InvisibleCut.tsx +272 -0
- package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/LightLeakBurn.tsx +262 -0
- package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/VersusSlam.tsx +217 -0
- package/lib/motion/shotcraft/upstream/demos/transition/transition-travel/LetterformZoom.tsx +285 -0
- package/lib/motion/shotcraft/upstream/demos/transition/white-flash-logo-simplify-cut/WhiteFlashLogoSimplifyCut.tsx +205 -0
- package/lib/motion/shotcraft/upstream/demos/transition/wipe-transitions/BlindsSlice.tsx +178 -0
- package/lib/motion/shotcraft/upstream/demos/typography/blur-slide/BlurSlide.tsx +147 -0
- package/lib/motion/shotcraft/upstream/demos/typography/brace-expand/BraceExpand.tsx +143 -0
- package/lib/motion/shotcraft/upstream/demos/typography/brand-ink-open/BrandInkOpen.tsx +134 -0
- package/lib/motion/shotcraft/upstream/demos/typography/countdown-arc-scatter/CountdownArcScatter.tsx +217 -0
- package/lib/motion/shotcraft/upstream/demos/typography/flying-words/FlyingWords.tsx +198 -0
- package/lib/motion/shotcraft/upstream/demos/typography/glitch-cycle/GlitchCycle.tsx +221 -0
- package/lib/motion/shotcraft/upstream/demos/typography/gradient-word-sweep/GradientWordSweep.tsx +312 -0
- package/lib/motion/shotcraft/upstream/demos/typography/lead-word-zoom-assemble/LeadWordZoomAssemble.tsx +261 -0
- package/lib/motion/shotcraft/upstream/demos/typography/marker-underline-title/MarkerUnderlineTitle.tsx +121 -0
- package/lib/motion/shotcraft/upstream/demos/typography/outline-word-fill/OutlineWordFill.tsx +153 -0
- package/lib/motion/shotcraft/upstream/demos/typography/paper-title-card/PaperTitleCard.tsx +179 -0
- package/lib/motion/shotcraft/upstream/demos/typography/pill-chip-slot-cycle-handled/PillChipSlotCycleHandled.tsx +140 -0
- package/lib/motion/shotcraft/upstream/demos/typography/pill-slot-cycle/PillSlotCycle.tsx +309 -0
- package/lib/motion/shotcraft/upstream/demos/typography/text-column-converge/TextColumnConverge.tsx +191 -0
- package/lib/motion/shotcraft/upstream/demos/typography/title-demote-to-label/TitleDemoteToLabel.tsx +292 -0
- package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/LetterformDriftAssembly.tsx +135 -0
- package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/SplitTextStagger.tsx +124 -0
- package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/TextOnPath.tsx +255 -0
- package/lib/motion/shotcraft/upstream/demos/typography/type-entrance-moves/LetterDropPhysics.tsx +173 -0
- package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/FontWeightPump.tsx +225 -0
- package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/KaraokeFillSync.tsx +141 -0
- package/lib/motion/shotcraft/upstream/demos/typography/typewriter-moves/TypewriterErrorRetype.tsx +137 -0
- package/lib/motion/shotcraft/upstream/demos/typography/vertical-word-roll-blur-cycle/VerticalWordRollBlurCycle.tsx +147 -0
- package/lib/motion/shotcraft/upstream/demos/typography/word-relay-filmstrip/WordRelayFilmstrip.tsx +409 -0
- package/lib/motion/shotcraft/upstream/demos/typography/word-relay-geometry/WordRelayGeometry.tsx +280 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/avatar-bracket-carousel/AvatarBracketCarousel.tsx +271 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/bezier-source-converge-merge/BezierSourceConvergeMerge.tsx +385 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/card-stack/CardStack.tsx +312 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/carousel-3d/Carousel3D.tsx +303 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/clipcard-looping/ClipCardLooping.tsx +77 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/cloner-depth-echo/ClonerDepthEcho.tsx +311 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx +307 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/doc-park-left-pill-deal/DocParkLeftPillDeal.tsx +349 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/document-typewriter-reveal/DocumentTypewriterReveal.tsx +255 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/draw-svg-trace/DrawSvgTrace.tsx +244 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/element-body-moves/ContactShadowLift.tsx +217 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/integration-hub-map/IntegrationHubMap.tsx +652 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-reveal/ListReveal.tsx +153 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-stack-press/ListStackPress.tsx +238 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-forerun/NeonFrameForerun.tsx +324 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +354 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/PageWaterfallWall.tsx +101 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/VerticalTicker.tsx +129 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/product-card-progressive-assemble/ProductCardProgressiveAssemble.tsx +297 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/radial-wave/RadialWave.tsx +57 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/research-card-stack-scroll/ResearchCardStackScroll.tsx +155 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/row-embed/RowEmbed.tsx +175 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/value-stagger-gradient/ValueStaggerGradient.tsx +153 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/BentoLightUp.tsx +146 -0
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/WireframeDrawOn.tsx +226 -0
- package/lib/motion/shotcraft/upstream/gallery/api/library.json +1 -0
- package/lib/motion/shotcraft/upstream/manifest.json +2715 -0
- package/lib/motion/shotcraft/upstream/references/aesthetic-rules.md +193 -0
- package/lib/motion/shotcraft/upstream/references/final-review.md +121 -0
- package/lib/motion/shotcraft/upstream/references/guided-free-creation.md +199 -0
- package/lib/motion/shotcraft/upstream/references/jianying-export.md +183 -0
- package/lib/motion/shotcraft/upstream/references/music-beat-sync.md +257 -0
- package/lib/motion/shotcraft/upstream/references/pipeline.md +382 -0
- package/lib/motion/shotcraft/upstream/references/publish-upload-post.md +111 -0
- package/lib/motion/shotcraft/upstream/references/sequences/promo-energy-arc.md +50 -0
- package/lib/motion/shotcraft/upstream/references/sfx-sourcing.md +95 -0
- package/lib/motion/shotcraft/upstream/references/shots/camera/basic-3d-scene.md +41 -0
- package/lib/motion/shotcraft/upstream/references/shots/camera/crash-zoom-punch.md +52 -0
- package/lib/motion/shotcraft/upstream/references/shots/camera/cursor-flyover.md +39 -0
- package/lib/motion/shotcraft/upstream/references/shots/camera/depth-layer-moves.md +39 -0
- package/lib/motion/shotcraft/upstream/references/shots/camera/graze-face-tour.md +57 -0
- package/lib/motion/shotcraft/upstream/references/shots/camera/overhead-camera-moves.md +51 -0
- package/lib/motion/shotcraft/upstream/references/shots/camera/space-camera-moves.md +46 -0
- package/lib/motion/shotcraft/upstream/references/shots/camera/steep-tilt-glide.md +52 -0
- package/lib/motion/shotcraft/upstream/references/shots/camera/tension-camera-moves.md +43 -0
- package/lib/motion/shotcraft/upstream/references/shots/camera/terminal-3d.md +42 -0
- package/lib/motion/shotcraft/upstream/references/shots/data/before-after-slider-scrub.md +48 -0
- package/lib/motion/shotcraft/upstream/references/shots/data/chart-live-moves.md +52 -0
- package/lib/motion/shotcraft/upstream/references/shots/data/gauge-readout-moves.md +45 -0
- package/lib/motion/shotcraft/upstream/references/shots/data/scroll-brake-moves.md +46 -0
- package/lib/motion/shotcraft/upstream/references/shots/data/timeline-travel.md +44 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/assemble-then-type-flyin.md +63 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/aurora-bloom-bg-flip.md +54 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/brand-frame-snap.md +58 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/fui-hud-moves.md +35 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/glow-flyline-moves.md +53 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/icon-performance-moves.md +42 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/impact-feedback.md +50 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/light-play-moves.md +46 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/radial-ripple-phone-chips.md +56 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/riso-print-hits.md +49 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/scan-bracket-sweep.md +50 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-annotate-focus.md +53 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-assemble-flyin.md +53 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/slam-entrance-moves.md +55 -0
- package/lib/motion/shotcraft/upstream/references/shots/effects/spotlight-sweep-moves.md +52 -0
- package/lib/motion/shotcraft/upstream/references/shots/interaction/autolayout-gap-dial.md +60 -0
- package/lib/motion/shotcraft/upstream/references/shots/interaction/canvas-materialize-moves.md +57 -0
- package/lib/motion/shotcraft/upstream/references/shots/interaction/chip-grid-single-select-blackout.md +51 -0
- package/lib/motion/shotcraft/upstream/references/shots/interaction/collab-cursor-moves.md +41 -0
- package/lib/motion/shotcraft/upstream/references/shots/interaction/glass-pill-dictation-typing.md +53 -0
- package/lib/motion/shotcraft/upstream/references/shots/interaction/hashtag-to-pill-materialize.md +60 -0
- package/lib/motion/shotcraft/upstream/references/shots/interaction/picker-carousel-feature-cycle.md +55 -0
- package/lib/motion/shotcraft/upstream/references/shots/interaction/segmented-thumb-hero.md +57 -0
- package/lib/motion/shotcraft/upstream/references/shots/interaction/theme-switch-moves.md +47 -0
- package/lib/motion/shotcraft/upstream/references/shots/interaction/type-and-filter.md +37 -0
- package/lib/motion/shotcraft/upstream/references/shots/interaction/voice-waveform-live.md +54 -0
- package/lib/motion/shotcraft/upstream/references/shots/opening/brand-ink-open.md +36 -0
- package/lib/motion/shotcraft/upstream/references/shots/opening/crane-rise-reveal.md +56 -0
- package/lib/motion/shotcraft/upstream/references/shots/opening/dataviz-landscape-open.md +56 -0
- package/lib/motion/shotcraft/upstream/references/shots/opening/fracture.md +40 -0
- package/lib/motion/shotcraft/upstream/references/shots/opening/icon-field-colorize.md +60 -0
- package/lib/motion/shotcraft/upstream/references/shots/opening/letterspace-materialize.md +57 -0
- package/lib/motion/shotcraft/upstream/references/shots/opening/magician-card-flourish.md +73 -0
- package/lib/motion/shotcraft/upstream/references/shots/opening/orbit-ring-title-open.md +87 -0
- package/lib/motion/shotcraft/upstream/references/shots/opening/spotlight-hero-card.md +55 -0
- package/lib/motion/shotcraft/upstream/references/shots/opening/stroke-segment-build.md +50 -0
- package/lib/motion/shotcraft/upstream/references/shots/opening/text-as-mask.md +59 -0
- package/lib/motion/shotcraft/upstream/references/shots/outro/grain-dissolve.md +38 -0
- package/lib/motion/shotcraft/upstream/references/shots/outro/logo-shrink-wordmark-lockup.md +38 -0
- package/lib/motion/shotcraft/upstream/references/shots/outro/neon-triple-marquee.md +59 -0
- package/lib/motion/shotcraft/upstream/references/shots/outro/outro-group-photo-launch.md +39 -0
- package/lib/motion/shotcraft/upstream/references/shots/outro/ui-strip-away-outro.md +61 -0
- package/lib/motion/shotcraft/upstream/references/shots/outro/ui-to-brand-morph.md +52 -0
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-cut-moves.md +50 -0
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-step-list-theme-cycle.md +66 -0
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/panel-grid-moves.md +43 -0
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/quad-split-parallel-scenes.md +38 -0
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/rhythm-interrupt-moves.md +38 -0
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/sakuga-timing-shift.md +56 -0
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/speed-ramp-freeze.md +44 -0
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/trailer-grammar-moves.md +38 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/bottom-push-stack-wipe.md +63 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/card-flip-reveal.md +57 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/card-flock-tumble.md +63 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/circle-match-iris.md +58 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/gradient-transition.md +45 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/line-carry-transition.md +55 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/mosaic-reframe.md +49 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/page-turn-transitions.md +42 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/print-texture-transitions.md +42 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/shot-transitions.md +45 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/tear-streak-transitions.md +48 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/transition-hidden-cut.md +55 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/transition-travel.md +43 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/white-flash-logo-simplify-cut.md +41 -0
- package/lib/motion/shotcraft/upstream/references/shots/transition/wipe-transitions.md +42 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/blur-slide.md +59 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/brace-expand.md +55 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/countdown-arc-scatter.md +65 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/document-typewriter-reveal.md +42 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/flying-words.md +64 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/glitch-cycle.md +64 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/gradient-word-sweep.md +54 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/lead-word-zoom-assemble.md +91 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/marker-underline-title.md +51 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/outline-word-fill.md +66 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/paper-title-card.md +38 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/pill-chip-slot-cycle-handled.md +66 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/pill-slot-cycle.md +58 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/text-column-converge.md +61 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/title-demote-to-label.md +64 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/type-assembly-moves.md +45 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/type-entrance-moves.md +41 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/type-rhythm-sync.md +51 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/typewriter-moves.md +42 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/vertical-word-roll-blur-cycle.md +63 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-filmstrip.md +57 -0
- package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-geometry.md +75 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/avatar-bracket-carousel.md +59 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/bezier-source-converge-merge.md +67 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/card-stack.md +60 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/carousel-3d.md +66 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/cloner-depth-echo.md +40 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/deck-deal-flyin.md +45 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/doc-park-left-pill-deal.md +62 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/draw-svg-trace.md +55 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/element-body-moves.md +37 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/integration-hub-map.md +55 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-reveal.md +50 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-stack-press.md +43 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-forerun.md +55 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-orbit-drop.md +51 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/page-waterfall-wall.md +51 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/product-card-progressive-assemble.md +56 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/radial-wave.md +49 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/research-card-stack-scroll.md +57 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/row-embed.md +36 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/value-stagger-gradient.md +64 -0
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/wall-reveal-moves.md +47 -0
- package/lib/motion/shotcraft/upstream/references/sound-design.md +170 -0
- package/lib/motion/shotcraft/upstream/references/workbench.md +157 -0
- package/lib/motion/shotcraft/upstream/template/TEMPLATE.md +103 -0
- package/lib/motion/shotcraft/upstream/template/THEMES.md +44 -0
- package/lib/motion/shotcraft/upstream/template/package.json +20 -0
- package/lib/motion/shotcraft/upstream/template/remotion.config.ts +6 -0
- package/lib/motion/shotcraft/upstream/template/src/Root.tsx +17 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/Caption.tsx +65 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/DigitRoll.tsx +48 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/FlashCut.tsx +24 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/Main.tsx +192 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/PaperTitleCard.tsx +111 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/PageCam.tsx +150 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneDetail.tsx +158 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneFlyIn.tsx +468 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOpen.tsx +552 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOutroLive.tsx +411 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/ScenePapers.tsx +200 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneWbr.tsx +324 -0
- package/lib/motion/shotcraft/upstream/template/src/aifl/live-layout.json +389 -0
- package/lib/motion/shotcraft/upstream/template/src/index.ts +4 -0
- package/lib/motion/shotcraft/upstream/template/src/themes/ThemedFilm.tsx +7 -0
- package/lib/motion/shotcraft/upstream/template/src/themes/manifest.tsx +68 -0
- package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.json +1 -0
- package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.ts +24 -0
- package/lib/motion/shotcraft/upstream/template/src/themes/palettes.json +74 -0
- package/lib/motion/shotcraft/upstream/template/src/themes/visual-theme.tsx +91 -0
- package/lib/motion/shotcraft/upstream/template/src/workbench.ts +213 -0
- package/lib/motion/shotcraft/upstream/template/tsconfig.json +15 -0
- package/lib/motion/spec.js +113 -0
- package/lib/motion/style-engine.js +153 -0
- package/lib/motion/style-frames.js +268 -0
- package/lib/motion/sync.js +214 -0
- package/lib/motion/theme.js +121 -0
- package/lib/motion/voice.js +417 -0
- package/lib/motion-agent-files.js +82 -0
- package/lib/motion-agent-protocol.js +66 -0
- package/lib/motion-agent-tools.js +196 -0
- package/lib/motion-agent.js +171 -0
- package/lib/motion-capture.js +92 -0
- package/lib/motion-core.js +238 -0
- package/lib/motion-film-review.js +71 -0
- package/lib/motion-library.js +210 -0
- package/lib/motion-planner.js +254 -0
- package/lib/motion-project.js +80 -0
- package/lib/motion-render-worker.js +145 -0
- package/lib/motion-session.js +32 -0
- package/lib/motion-source.js +49 -0
- package/lib/motion-tasks.js +452 -0
- package/lib/motion-vision.js +43 -0
- package/lib/mxfile.js +27 -7
- package/lib/routing/node-runtime.js +14 -0
- package/lib/routing/router.js +211 -0
- package/lib/routing/vendor/README.md +96 -0
- package/lib/routing/vendor/libavoid-routing.js +753 -0
- package/lib/routing/vendor/libavoid.min.js +59 -0
- package/lib/shotcard-core.js +39 -0
- package/lib/shotcard-reference.js +56 -0
- package/lib/style-kernel.js +37 -3
- package/lib/task-patches.js +26 -2
- package/lib/video-export.js +17 -2
- 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
|
+
}
|
package/lib/drawing-tasks.js
CHANGED
|
@@ -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')) } },
|