dsh-drawai 0.4.1 → 0.4.3

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 (365) hide show
  1. package/README.md +96 -253
  2. package/lib/client.js +28 -7
  3. package/lib/index.js +474 -97
  4. package/lib/motion/asset-pack.js +109 -50
  5. package/lib/motion/assets.js +291 -291
  6. package/lib/motion/demo-assets-lock.js +10 -0
  7. package/lib/motion/mgstyles/vendor/README.md +28 -0
  8. package/lib/motion/mgstyles/vendor/modules/d3/LICENSE +13 -0
  9. package/lib/motion/mgstyles/vendor/modules/d3/dist/d3.min.js +2 -0
  10. package/lib/motion/mgstyles/vendor/modules/opentype.js/LICENSE +20 -0
  11. package/lib/motion/mgstyles/vendor/modules/opentype.js/dist/opentype.mjs +14460 -0
  12. package/lib/motion/mgstyles/vendor/modules/simplex-noise/LICENSE +21 -0
  13. package/lib/motion/mgstyles/vendor/modules/simplex-noise/dist/esm/simplex-noise.js +466 -0
  14. package/lib/motion/mgstyles/vendor/modules/topojson-client/LICENSE +13 -0
  15. package/lib/motion/mgstyles/vendor/modules/topojson-client/dist/topojson-client.min.js +2 -0
  16. package/lib/motion/preview.js +10 -3
  17. package/lib/motion/render.js +19 -1
  18. package/lib/motion/shotcraft/upstream/SKILL.md +286 -286
  19. package/lib/motion/shotcraft/upstream/assets/lib/Caption.tsx +54 -54
  20. package/lib/motion/shotcraft/upstream/assets/lib/ClipCard.tsx +200 -200
  21. package/lib/motion/shotcraft/upstream/assets/lib/DigitRoll.tsx +45 -45
  22. package/lib/motion/shotcraft/upstream/assets/lib/FlashCut.tsx +20 -20
  23. package/lib/motion/shotcraft/upstream/assets/lib/FlatPanel.tsx +65 -65
  24. package/lib/motion/shotcraft/upstream/assets/lib/PageCam.tsx +151 -151
  25. package/lib/motion/shotcraft/upstream/assets/lib/VerticalTicker.tsx +129 -129
  26. package/lib/motion/shotcraft/upstream/assets/lib/helpers/camera.tsx +75 -75
  27. package/lib/motion/shotcraft/upstream/assets/lib/helpers/motion.ts +40 -40
  28. package/lib/motion/shotcraft/upstream/assets/lib/helpers/rand.ts +11 -11
  29. package/lib/motion/shotcraft/upstream/assets/lib/helpers/shake.ts +10 -10
  30. package/lib/motion/shotcraft/upstream/assets/scripts/build-readme-cover.mjs +49 -49
  31. package/lib/motion/shotcraft/upstream/assets/scripts/capture-template.mjs +210 -210
  32. package/lib/motion/shotcraft/upstream/assets/scripts/sfx-source.py +423 -423
  33. package/lib/motion/shotcraft/upstream/assets/scripts/smoke-render-demos.py +170 -170
  34. package/lib/motion/shotcraft/upstream/assets/scripts/test_sfx_source.py +157 -157
  35. package/lib/motion/shotcraft/upstream/demos/README.md +120 -120
  36. package/lib/motion/shotcraft/upstream/demos/_fixtures/Brand.tsx +112 -112
  37. package/lib/motion/shotcraft/upstream/demos/_fixtures/Fixtures.tsx +647 -647
  38. package/lib/motion/shotcraft/upstream/demos/_fixtures/Look.tsx +316 -316
  39. package/lib/motion/shotcraft/upstream/demos/_fixtures/Motion.tsx +82 -82
  40. package/lib/motion/shotcraft/upstream/demos/_fixtures/PageCam2D.tsx +115 -115
  41. package/lib/motion/shotcraft/upstream/demos/_fixtures/Polish.tsx +243 -243
  42. package/lib/motion/shotcraft/upstream/demos/_textures/live-layout.json +388 -388
  43. package/lib/motion/shotcraft/upstream/demos/camera/basic-3d-scene/Basic3DScene.tsx +250 -250
  44. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashImpactReal.tsx +305 -305
  45. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashZoomReal.tsx +246 -246
  46. package/lib/motion/shotcraft/upstream/demos/camera/cursor-flyover/CursorFlyover.tsx +390 -390
  47. package/lib/motion/shotcraft/upstream/demos/camera/depth-layer-moves/MultiplaneReal.tsx +138 -138
  48. package/lib/motion/shotcraft/upstream/demos/camera/graze-face-tour/GrazeFaceTour.tsx +542 -542
  49. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/OverheadTabletopDrop.tsx +315 -315
  50. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/TiltReveal.tsx +299 -299
  51. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/DroneDiveLanding.tsx +173 -173
  52. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/ExplodedView.tsx +348 -348
  53. package/lib/motion/shotcraft/upstream/demos/camera/steep-tilt-glide/SteepTiltGlide.tsx +366 -366
  54. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx +279 -279
  55. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/PullBackIsolation.tsx +184 -184
  56. package/lib/motion/shotcraft/upstream/demos/camera/terminal-3d/Terminal3D.tsx +390 -390
  57. package/lib/motion/shotcraft/upstream/demos/data/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +155 -155
  58. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/AxisRescaleShockV2.tsx +303 -303
  59. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/OscilloscopeStreamV2.tsx +290 -290
  60. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/UnitDotSwarmRegroupV2.tsx +278 -278
  61. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/NeedleSweepSelftest.tsx +307 -307
  62. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/TapeScrollFixedPointer.tsx +215 -215
  63. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/BrakeReticleLock.tsx +299 -299
  64. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/ChangelogScrollBrake.tsx +232 -232
  65. package/lib/motion/shotcraft/upstream/demos/data/timeline-travel/TimelineTravel.tsx +290 -290
  66. package/lib/motion/shotcraft/upstream/demos/effects/assemble-then-type-flyin/AssembleThenTypeFlyin.tsx +273 -273
  67. package/lib/motion/shotcraft/upstream/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx +167 -167
  68. package/lib/motion/shotcraft/upstream/demos/effects/brand-frame-snap/BrandFrameSnap.tsx +536 -536
  69. package/lib/motion/shotcraft/upstream/demos/effects/fui-hud-moves/ReticleLockOn.tsx +164 -164
  70. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/FlylineArc.tsx +175 -175
  71. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/GlowOrbAmbient.tsx +197 -197
  72. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/OrbFlylineRelay.tsx +241 -241
  73. package/lib/motion/shotcraft/upstream/demos/effects/icon-performance-moves/AttentionBounce.tsx +279 -279
  74. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/AnimeImpact.tsx +230 -230
  75. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/HitCounter.tsx +345 -345
  76. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SheenSweepRetry.tsx +275 -275
  77. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SpotlightSweepReveal.tsx +229 -229
  78. package/lib/motion/shotcraft/upstream/demos/effects/radial-ripple-phone-chips/RadialRipplePhoneChips.tsx +312 -312
  79. package/lib/motion/shotcraft/upstream/demos/effects/riso-print-hits/RisoMisregistrationHit.tsx +222 -222
  80. package/lib/motion/shotcraft/upstream/demos/effects/scan-bracket-sweep/ScanBracketSweep.tsx +295 -295
  81. package/lib/motion/shotcraft/upstream/demos/effects/scanline-annotate-focus/ScanlineAnnotateFocus.tsx +329 -329
  82. package/lib/motion/shotcraft/upstream/demos/effects/scanline-assemble-flyin/ScanlineAssembleFlyin.tsx +315 -315
  83. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ImpactBurstKit.tsx +264 -264
  84. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/KanadaPerspectiveSnap.tsx +260 -260
  85. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ScoreSlam.tsx +263 -263
  86. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/CornerSpotlightReveal.tsx +123 -123
  87. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +187 -187
  88. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/SlideSpotlightPan.tsx +175 -175
  89. package/lib/motion/shotcraft/upstream/demos/interaction/autolayout-gap-dial/AutolayoutGapDial.tsx +305 -305
  90. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/DiagramCascadeBuild.tsx +350 -350
  91. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +352 -352
  92. package/lib/motion/shotcraft/upstream/demos/interaction/chip-grid-single-select-blackout/ChipGridSingleSelectBlackout.tsx +218 -218
  93. package/lib/motion/shotcraft/upstream/demos/interaction/collab-cursor-moves/CursorCastEnsemble.tsx +297 -297
  94. package/lib/motion/shotcraft/upstream/demos/interaction/glass-pill-dictation-typing/GlassPillDictationTyping.tsx +157 -157
  95. package/lib/motion/shotcraft/upstream/demos/interaction/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +218 -218
  96. package/lib/motion/shotcraft/upstream/demos/interaction/picker-carousel-feature-cycle/PickerCarouselFeatureCycle.tsx +202 -202
  97. package/lib/motion/shotcraft/upstream/demos/interaction/segmented-thumb-hero/SegmentedThumbHero.tsx +265 -265
  98. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/PaletteThemeRipple.tsx +457 -457
  99. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/ThemeSweepToggle.tsx +446 -446
  100. package/lib/motion/shotcraft/upstream/demos/interaction/type-and-filter/TypeAndFilter.tsx +249 -249
  101. package/lib/motion/shotcraft/upstream/demos/interaction/voice-waveform-live/VoiceWaveformLive.tsx +278 -278
  102. package/lib/motion/shotcraft/upstream/demos/opening/crane-rise-reveal/CraneRiseReveal.tsx +332 -332
  103. package/lib/motion/shotcraft/upstream/demos/opening/dataviz-landscape-open/DatavizLandscapeOpen.tsx +358 -358
  104. package/lib/motion/shotcraft/upstream/demos/opening/fracture/Fracture.tsx +201 -201
  105. package/lib/motion/shotcraft/upstream/demos/opening/icon-field-colorize/IconFieldColorize.tsx +200 -200
  106. package/lib/motion/shotcraft/upstream/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx +208 -208
  107. package/lib/motion/shotcraft/upstream/demos/opening/magician-card-flourish/MagicianCardFlourish.tsx +341 -341
  108. package/lib/motion/shotcraft/upstream/demos/opening/orbit-ring-title-open/OrbitRingTitleOpen.tsx +389 -389
  109. package/lib/motion/shotcraft/upstream/demos/opening/spotlight-hero-card/SpotlightHeroCard.tsx +293 -293
  110. package/lib/motion/shotcraft/upstream/demos/opening/stroke-segment-build/StrokeSegmentBuild.tsx +183 -183
  111. package/lib/motion/shotcraft/upstream/demos/opening/text-as-mask/TextAsMask.tsx +245 -245
  112. package/lib/motion/shotcraft/upstream/demos/outro/grain-dissolve/GrainDissolve.tsx +222 -222
  113. package/lib/motion/shotcraft/upstream/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx +223 -223
  114. package/lib/motion/shotcraft/upstream/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx +217 -217
  115. package/lib/motion/shotcraft/upstream/demos/outro/outro-group-photo-launch/OutroGroupPhotoLaunch.tsx +343 -343
  116. package/lib/motion/shotcraft/upstream/demos/outro/ui-strip-away-outro/UiStripAwayOutro.tsx +357 -357
  117. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/IconFlipBloomLogo.tsx +187 -187
  118. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/InputMorphsIntoLogo.tsx +333 -333
  119. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-cut-moves/PaparazziFlash.tsx +274 -274
  120. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +270 -270
  121. package/lib/motion/shotcraft/upstream/demos/rhythm/panel-grid-moves/ComicPanelSplit.tsx +430 -430
  122. package/lib/motion/shotcraft/upstream/demos/rhythm/quad-split-parallel-scenes/QuadSplitParallelScenes.tsx +252 -252
  123. package/lib/motion/shotcraft/upstream/demos/rhythm/rhythm-interrupt-moves/JumpCutPunchIn.tsx +106 -106
  124. package/lib/motion/shotcraft/upstream/demos/rhythm/sakuga-timing-shift/SakugaTimingShift.tsx +288 -288
  125. package/lib/motion/shotcraft/upstream/demos/rhythm/speed-ramp-freeze/FreezeAnnotateReal.tsx +362 -362
  126. package/lib/motion/shotcraft/upstream/demos/rhythm/trailer-grammar-moves/TrailerBumper.tsx +168 -168
  127. package/lib/motion/shotcraft/upstream/demos/transition/bottom-push-stack-wipe/BottomPushStackWipe.tsx +310 -310
  128. package/lib/motion/shotcraft/upstream/demos/transition/card-flip-reveal/CardFlipReveal.tsx +261 -261
  129. package/lib/motion/shotcraft/upstream/demos/transition/card-flock-tumble/CardFlockTumble.tsx +459 -459
  130. package/lib/motion/shotcraft/upstream/demos/transition/circle-match-iris/CircleMatchIris.tsx +294 -294
  131. package/lib/motion/shotcraft/upstream/demos/transition/gradient-transition/GradientTransition.tsx +161 -161
  132. package/lib/motion/shotcraft/upstream/demos/transition/line-carry-transition/LineCarryTransition.tsx +248 -248
  133. package/lib/motion/shotcraft/upstream/demos/transition/mosaic-reframe/MosaicReframe.tsx +359 -359
  134. package/lib/motion/shotcraft/upstream/demos/transition/page-turn-transitions/BarnDoorSplit.tsx +227 -227
  135. package/lib/motion/shotcraft/upstream/demos/transition/print-texture-transitions/InkBleedReveal.tsx +162 -162
  136. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/PortalWipeV2.tsx +248 -248
  137. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/WhipBrakeReal.tsx +186 -186
  138. package/lib/motion/shotcraft/upstream/demos/transition/tear-streak-transitions/GlitchDisplace.tsx +355 -355
  139. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/InvisibleCut.tsx +272 -272
  140. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/LightLeakBurn.tsx +262 -262
  141. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/VersusSlam.tsx +217 -217
  142. package/lib/motion/shotcraft/upstream/demos/transition/transition-travel/LetterformZoom.tsx +285 -285
  143. package/lib/motion/shotcraft/upstream/demos/transition/white-flash-logo-simplify-cut/WhiteFlashLogoSimplifyCut.tsx +205 -205
  144. package/lib/motion/shotcraft/upstream/demos/transition/wipe-transitions/BlindsSlice.tsx +178 -178
  145. package/lib/motion/shotcraft/upstream/demos/typography/blur-slide/BlurSlide.tsx +147 -147
  146. package/lib/motion/shotcraft/upstream/demos/typography/brace-expand/BraceExpand.tsx +143 -143
  147. package/lib/motion/shotcraft/upstream/demos/typography/brand-ink-open/BrandInkOpen.tsx +134 -134
  148. package/lib/motion/shotcraft/upstream/demos/typography/countdown-arc-scatter/CountdownArcScatter.tsx +217 -217
  149. package/lib/motion/shotcraft/upstream/demos/typography/flying-words/FlyingWords.tsx +198 -198
  150. package/lib/motion/shotcraft/upstream/demos/typography/glitch-cycle/GlitchCycle.tsx +221 -221
  151. package/lib/motion/shotcraft/upstream/demos/typography/gradient-word-sweep/GradientWordSweep.tsx +312 -312
  152. package/lib/motion/shotcraft/upstream/demos/typography/lead-word-zoom-assemble/LeadWordZoomAssemble.tsx +261 -261
  153. package/lib/motion/shotcraft/upstream/demos/typography/marker-underline-title/MarkerUnderlineTitle.tsx +121 -121
  154. package/lib/motion/shotcraft/upstream/demos/typography/outline-word-fill/OutlineWordFill.tsx +153 -153
  155. package/lib/motion/shotcraft/upstream/demos/typography/paper-title-card/PaperTitleCard.tsx +179 -179
  156. package/lib/motion/shotcraft/upstream/demos/typography/pill-chip-slot-cycle-handled/PillChipSlotCycleHandled.tsx +140 -140
  157. package/lib/motion/shotcraft/upstream/demos/typography/pill-slot-cycle/PillSlotCycle.tsx +309 -309
  158. package/lib/motion/shotcraft/upstream/demos/typography/text-column-converge/TextColumnConverge.tsx +191 -191
  159. package/lib/motion/shotcraft/upstream/demos/typography/title-demote-to-label/TitleDemoteToLabel.tsx +292 -292
  160. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/LetterformDriftAssembly.tsx +135 -135
  161. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/SplitTextStagger.tsx +124 -124
  162. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/TextOnPath.tsx +255 -255
  163. package/lib/motion/shotcraft/upstream/demos/typography/type-entrance-moves/LetterDropPhysics.tsx +173 -173
  164. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/FontWeightPump.tsx +225 -225
  165. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/KaraokeFillSync.tsx +141 -141
  166. package/lib/motion/shotcraft/upstream/demos/typography/typewriter-moves/TypewriterErrorRetype.tsx +137 -137
  167. package/lib/motion/shotcraft/upstream/demos/typography/vertical-word-roll-blur-cycle/VerticalWordRollBlurCycle.tsx +147 -147
  168. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-filmstrip/WordRelayFilmstrip.tsx +409 -409
  169. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-geometry/WordRelayGeometry.tsx +280 -280
  170. package/lib/motion/shotcraft/upstream/demos/ui-entrance/avatar-bracket-carousel/AvatarBracketCarousel.tsx +271 -271
  171. package/lib/motion/shotcraft/upstream/demos/ui-entrance/bezier-source-converge-merge/BezierSourceConvergeMerge.tsx +385 -385
  172. package/lib/motion/shotcraft/upstream/demos/ui-entrance/card-stack/CardStack.tsx +312 -312
  173. package/lib/motion/shotcraft/upstream/demos/ui-entrance/carousel-3d/Carousel3D.tsx +303 -303
  174. package/lib/motion/shotcraft/upstream/demos/ui-entrance/clipcard-looping/ClipCardLooping.tsx +77 -77
  175. package/lib/motion/shotcraft/upstream/demos/ui-entrance/cloner-depth-echo/ClonerDepthEcho.tsx +311 -311
  176. package/lib/motion/shotcraft/upstream/demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx +307 -307
  177. package/lib/motion/shotcraft/upstream/demos/ui-entrance/doc-park-left-pill-deal/DocParkLeftPillDeal.tsx +349 -349
  178. package/lib/motion/shotcraft/upstream/demos/ui-entrance/document-typewriter-reveal/DocumentTypewriterReveal.tsx +255 -255
  179. package/lib/motion/shotcraft/upstream/demos/ui-entrance/draw-svg-trace/DrawSvgTrace.tsx +244 -244
  180. package/lib/motion/shotcraft/upstream/demos/ui-entrance/element-body-moves/ContactShadowLift.tsx +217 -217
  181. package/lib/motion/shotcraft/upstream/demos/ui-entrance/integration-hub-map/IntegrationHubMap.tsx +652 -652
  182. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-reveal/ListReveal.tsx +153 -153
  183. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-stack-press/ListStackPress.tsx +238 -238
  184. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-forerun/NeonFrameForerun.tsx +324 -324
  185. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +354 -354
  186. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/PageWaterfallWall.tsx +101 -101
  187. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/VerticalTicker.tsx +129 -129
  188. package/lib/motion/shotcraft/upstream/demos/ui-entrance/product-card-progressive-assemble/ProductCardProgressiveAssemble.tsx +297 -297
  189. package/lib/motion/shotcraft/upstream/demos/ui-entrance/radial-wave/RadialWave.tsx +57 -57
  190. package/lib/motion/shotcraft/upstream/demos/ui-entrance/research-card-stack-scroll/ResearchCardStackScroll.tsx +155 -155
  191. package/lib/motion/shotcraft/upstream/demos/ui-entrance/row-embed/RowEmbed.tsx +175 -175
  192. package/lib/motion/shotcraft/upstream/demos/ui-entrance/value-stagger-gradient/ValueStaggerGradient.tsx +153 -153
  193. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/BentoLightUp.tsx +146 -146
  194. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/WireframeDrawOn.tsx +226 -226
  195. package/lib/motion/shotcraft/upstream/gallery/api/library.json +1 -1
  196. package/lib/motion/shotcraft/upstream/references/aesthetic-rules.md +193 -193
  197. package/lib/motion/shotcraft/upstream/references/final-review.md +121 -121
  198. package/lib/motion/shotcraft/upstream/references/guided-free-creation.md +199 -199
  199. package/lib/motion/shotcraft/upstream/references/jianying-export.md +183 -183
  200. package/lib/motion/shotcraft/upstream/references/music-beat-sync.md +257 -257
  201. package/lib/motion/shotcraft/upstream/references/pipeline.md +382 -382
  202. package/lib/motion/shotcraft/upstream/references/publish-upload-post.md +111 -111
  203. package/lib/motion/shotcraft/upstream/references/sequences/promo-energy-arc.md +50 -50
  204. package/lib/motion/shotcraft/upstream/references/sfx-sourcing.md +95 -95
  205. package/lib/motion/shotcraft/upstream/references/shots/camera/basic-3d-scene.md +41 -41
  206. package/lib/motion/shotcraft/upstream/references/shots/camera/crash-zoom-punch.md +52 -52
  207. package/lib/motion/shotcraft/upstream/references/shots/camera/cursor-flyover.md +39 -39
  208. package/lib/motion/shotcraft/upstream/references/shots/camera/depth-layer-moves.md +39 -39
  209. package/lib/motion/shotcraft/upstream/references/shots/camera/graze-face-tour.md +57 -57
  210. package/lib/motion/shotcraft/upstream/references/shots/camera/overhead-camera-moves.md +51 -51
  211. package/lib/motion/shotcraft/upstream/references/shots/camera/space-camera-moves.md +46 -46
  212. package/lib/motion/shotcraft/upstream/references/shots/camera/steep-tilt-glide.md +52 -52
  213. package/lib/motion/shotcraft/upstream/references/shots/camera/tension-camera-moves.md +43 -43
  214. package/lib/motion/shotcraft/upstream/references/shots/camera/terminal-3d.md +42 -42
  215. package/lib/motion/shotcraft/upstream/references/shots/data/before-after-slider-scrub.md +48 -48
  216. package/lib/motion/shotcraft/upstream/references/shots/data/chart-live-moves.md +52 -52
  217. package/lib/motion/shotcraft/upstream/references/shots/data/gauge-readout-moves.md +45 -45
  218. package/lib/motion/shotcraft/upstream/references/shots/data/scroll-brake-moves.md +46 -46
  219. package/lib/motion/shotcraft/upstream/references/shots/data/timeline-travel.md +44 -44
  220. package/lib/motion/shotcraft/upstream/references/shots/effects/assemble-then-type-flyin.md +63 -63
  221. package/lib/motion/shotcraft/upstream/references/shots/effects/aurora-bloom-bg-flip.md +54 -54
  222. package/lib/motion/shotcraft/upstream/references/shots/effects/brand-frame-snap.md +58 -58
  223. package/lib/motion/shotcraft/upstream/references/shots/effects/fui-hud-moves.md +35 -35
  224. package/lib/motion/shotcraft/upstream/references/shots/effects/glow-flyline-moves.md +53 -53
  225. package/lib/motion/shotcraft/upstream/references/shots/effects/icon-performance-moves.md +42 -42
  226. package/lib/motion/shotcraft/upstream/references/shots/effects/impact-feedback.md +50 -50
  227. package/lib/motion/shotcraft/upstream/references/shots/effects/light-play-moves.md +46 -46
  228. package/lib/motion/shotcraft/upstream/references/shots/effects/radial-ripple-phone-chips.md +56 -56
  229. package/lib/motion/shotcraft/upstream/references/shots/effects/riso-print-hits.md +49 -49
  230. package/lib/motion/shotcraft/upstream/references/shots/effects/scan-bracket-sweep.md +50 -50
  231. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-annotate-focus.md +53 -53
  232. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-assemble-flyin.md +53 -53
  233. package/lib/motion/shotcraft/upstream/references/shots/effects/slam-entrance-moves.md +55 -55
  234. package/lib/motion/shotcraft/upstream/references/shots/effects/spotlight-sweep-moves.md +52 -52
  235. package/lib/motion/shotcraft/upstream/references/shots/interaction/autolayout-gap-dial.md +60 -60
  236. package/lib/motion/shotcraft/upstream/references/shots/interaction/canvas-materialize-moves.md +57 -57
  237. package/lib/motion/shotcraft/upstream/references/shots/interaction/chip-grid-single-select-blackout.md +51 -51
  238. package/lib/motion/shotcraft/upstream/references/shots/interaction/collab-cursor-moves.md +41 -41
  239. package/lib/motion/shotcraft/upstream/references/shots/interaction/glass-pill-dictation-typing.md +53 -53
  240. package/lib/motion/shotcraft/upstream/references/shots/interaction/hashtag-to-pill-materialize.md +60 -60
  241. package/lib/motion/shotcraft/upstream/references/shots/interaction/picker-carousel-feature-cycle.md +55 -55
  242. package/lib/motion/shotcraft/upstream/references/shots/interaction/segmented-thumb-hero.md +57 -57
  243. package/lib/motion/shotcraft/upstream/references/shots/interaction/theme-switch-moves.md +47 -47
  244. package/lib/motion/shotcraft/upstream/references/shots/interaction/type-and-filter.md +37 -37
  245. package/lib/motion/shotcraft/upstream/references/shots/interaction/voice-waveform-live.md +54 -54
  246. package/lib/motion/shotcraft/upstream/references/shots/opening/brand-ink-open.md +36 -36
  247. package/lib/motion/shotcraft/upstream/references/shots/opening/crane-rise-reveal.md +56 -56
  248. package/lib/motion/shotcraft/upstream/references/shots/opening/dataviz-landscape-open.md +56 -56
  249. package/lib/motion/shotcraft/upstream/references/shots/opening/fracture.md +40 -40
  250. package/lib/motion/shotcraft/upstream/references/shots/opening/icon-field-colorize.md +60 -60
  251. package/lib/motion/shotcraft/upstream/references/shots/opening/letterspace-materialize.md +57 -57
  252. package/lib/motion/shotcraft/upstream/references/shots/opening/magician-card-flourish.md +73 -73
  253. package/lib/motion/shotcraft/upstream/references/shots/opening/orbit-ring-title-open.md +87 -87
  254. package/lib/motion/shotcraft/upstream/references/shots/opening/spotlight-hero-card.md +55 -55
  255. package/lib/motion/shotcraft/upstream/references/shots/opening/stroke-segment-build.md +50 -50
  256. package/lib/motion/shotcraft/upstream/references/shots/opening/text-as-mask.md +59 -59
  257. package/lib/motion/shotcraft/upstream/references/shots/outro/grain-dissolve.md +38 -38
  258. package/lib/motion/shotcraft/upstream/references/shots/outro/logo-shrink-wordmark-lockup.md +38 -38
  259. package/lib/motion/shotcraft/upstream/references/shots/outro/neon-triple-marquee.md +59 -59
  260. package/lib/motion/shotcraft/upstream/references/shots/outro/outro-group-photo-launch.md +39 -39
  261. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-strip-away-outro.md +61 -61
  262. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-to-brand-morph.md +52 -52
  263. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-cut-moves.md +50 -50
  264. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-step-list-theme-cycle.md +66 -66
  265. package/lib/motion/shotcraft/upstream/references/shots/rhythm/panel-grid-moves.md +43 -43
  266. package/lib/motion/shotcraft/upstream/references/shots/rhythm/quad-split-parallel-scenes.md +38 -38
  267. package/lib/motion/shotcraft/upstream/references/shots/rhythm/rhythm-interrupt-moves.md +38 -38
  268. package/lib/motion/shotcraft/upstream/references/shots/rhythm/sakuga-timing-shift.md +56 -56
  269. package/lib/motion/shotcraft/upstream/references/shots/rhythm/speed-ramp-freeze.md +44 -44
  270. package/lib/motion/shotcraft/upstream/references/shots/rhythm/trailer-grammar-moves.md +38 -38
  271. package/lib/motion/shotcraft/upstream/references/shots/transition/bottom-push-stack-wipe.md +63 -63
  272. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flip-reveal.md +57 -57
  273. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flock-tumble.md +63 -63
  274. package/lib/motion/shotcraft/upstream/references/shots/transition/circle-match-iris.md +58 -58
  275. package/lib/motion/shotcraft/upstream/references/shots/transition/gradient-transition.md +45 -45
  276. package/lib/motion/shotcraft/upstream/references/shots/transition/line-carry-transition.md +55 -55
  277. package/lib/motion/shotcraft/upstream/references/shots/transition/mosaic-reframe.md +49 -49
  278. package/lib/motion/shotcraft/upstream/references/shots/transition/page-turn-transitions.md +42 -42
  279. package/lib/motion/shotcraft/upstream/references/shots/transition/print-texture-transitions.md +42 -42
  280. package/lib/motion/shotcraft/upstream/references/shots/transition/shot-transitions.md +45 -45
  281. package/lib/motion/shotcraft/upstream/references/shots/transition/tear-streak-transitions.md +48 -48
  282. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-hidden-cut.md +55 -55
  283. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-travel.md +43 -43
  284. package/lib/motion/shotcraft/upstream/references/shots/transition/white-flash-logo-simplify-cut.md +41 -41
  285. package/lib/motion/shotcraft/upstream/references/shots/transition/wipe-transitions.md +42 -42
  286. package/lib/motion/shotcraft/upstream/references/shots/typography/blur-slide.md +59 -59
  287. package/lib/motion/shotcraft/upstream/references/shots/typography/brace-expand.md +55 -55
  288. package/lib/motion/shotcraft/upstream/references/shots/typography/countdown-arc-scatter.md +65 -65
  289. package/lib/motion/shotcraft/upstream/references/shots/typography/document-typewriter-reveal.md +42 -42
  290. package/lib/motion/shotcraft/upstream/references/shots/typography/flying-words.md +64 -64
  291. package/lib/motion/shotcraft/upstream/references/shots/typography/glitch-cycle.md +64 -64
  292. package/lib/motion/shotcraft/upstream/references/shots/typography/gradient-word-sweep.md +54 -54
  293. package/lib/motion/shotcraft/upstream/references/shots/typography/lead-word-zoom-assemble.md +91 -91
  294. package/lib/motion/shotcraft/upstream/references/shots/typography/marker-underline-title.md +51 -51
  295. package/lib/motion/shotcraft/upstream/references/shots/typography/outline-word-fill.md +66 -66
  296. package/lib/motion/shotcraft/upstream/references/shots/typography/paper-title-card.md +38 -38
  297. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-chip-slot-cycle-handled.md +66 -66
  298. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-slot-cycle.md +58 -58
  299. package/lib/motion/shotcraft/upstream/references/shots/typography/text-column-converge.md +61 -61
  300. package/lib/motion/shotcraft/upstream/references/shots/typography/title-demote-to-label.md +64 -64
  301. package/lib/motion/shotcraft/upstream/references/shots/typography/type-assembly-moves.md +45 -45
  302. package/lib/motion/shotcraft/upstream/references/shots/typography/type-entrance-moves.md +41 -41
  303. package/lib/motion/shotcraft/upstream/references/shots/typography/type-rhythm-sync.md +51 -51
  304. package/lib/motion/shotcraft/upstream/references/shots/typography/typewriter-moves.md +42 -42
  305. package/lib/motion/shotcraft/upstream/references/shots/typography/vertical-word-roll-blur-cycle.md +63 -63
  306. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-filmstrip.md +57 -57
  307. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-geometry.md +75 -75
  308. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/avatar-bracket-carousel.md +59 -59
  309. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/bezier-source-converge-merge.md +67 -67
  310. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/card-stack.md +60 -60
  311. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/carousel-3d.md +66 -66
  312. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/cloner-depth-echo.md +40 -40
  313. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/deck-deal-flyin.md +45 -45
  314. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/doc-park-left-pill-deal.md +62 -62
  315. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/draw-svg-trace.md +55 -55
  316. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/element-body-moves.md +37 -37
  317. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/integration-hub-map.md +55 -55
  318. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-reveal.md +50 -50
  319. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-stack-press.md +43 -43
  320. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-forerun.md +55 -55
  321. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-orbit-drop.md +51 -51
  322. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/page-waterfall-wall.md +51 -51
  323. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/product-card-progressive-assemble.md +56 -56
  324. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/radial-wave.md +49 -49
  325. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/research-card-stack-scroll.md +57 -57
  326. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/row-embed.md +36 -36
  327. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/value-stagger-gradient.md +64 -64
  328. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/wall-reveal-moves.md +47 -47
  329. package/lib/motion/shotcraft/upstream/references/sound-design.md +170 -170
  330. package/lib/motion/shotcraft/upstream/references/workbench.md +157 -157
  331. package/lib/motion/shotcraft/upstream/template/TEMPLATE.md +103 -103
  332. package/lib/motion/shotcraft/upstream/template/THEMES.md +44 -44
  333. package/lib/motion/shotcraft/upstream/template/package.json +20 -20
  334. package/lib/motion/shotcraft/upstream/template/remotion.config.ts +6 -6
  335. package/lib/motion/shotcraft/upstream/template/src/Root.tsx +17 -17
  336. package/lib/motion/shotcraft/upstream/template/src/aifl/Caption.tsx +65 -65
  337. package/lib/motion/shotcraft/upstream/template/src/aifl/DigitRoll.tsx +48 -48
  338. package/lib/motion/shotcraft/upstream/template/src/aifl/FlashCut.tsx +24 -24
  339. package/lib/motion/shotcraft/upstream/template/src/aifl/Main.tsx +192 -192
  340. package/lib/motion/shotcraft/upstream/template/src/aifl/PaperTitleCard.tsx +111 -111
  341. package/lib/motion/shotcraft/upstream/template/src/aifl/live/PageCam.tsx +150 -150
  342. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneDetail.tsx +158 -158
  343. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneFlyIn.tsx +468 -468
  344. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOpen.tsx +552 -552
  345. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOutroLive.tsx +411 -411
  346. package/lib/motion/shotcraft/upstream/template/src/aifl/live/ScenePapers.tsx +200 -200
  347. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneWbr.tsx +324 -324
  348. package/lib/motion/shotcraft/upstream/template/src/aifl/live-layout.json +388 -388
  349. package/lib/motion/shotcraft/upstream/template/src/index.ts +4 -4
  350. package/lib/motion/shotcraft/upstream/template/src/themes/ThemedFilm.tsx +7 -7
  351. package/lib/motion/shotcraft/upstream/template/src/themes/manifest.tsx +68 -68
  352. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.json +1 -1
  353. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.ts +24 -24
  354. package/lib/motion/shotcraft/upstream/template/src/themes/palettes.json +74 -74
  355. package/lib/motion/shotcraft/upstream/template/src/themes/visual-theme.tsx +91 -91
  356. package/lib/motion/shotcraft/upstream/template/src/workbench.ts +213 -213
  357. package/lib/motion/shotcraft/upstream/template/tsconfig.json +15 -15
  358. package/lib/motion/style-frames.js +47 -12
  359. package/lib/motion-project.js +22 -3
  360. package/lib/motion-render-worker.js +31 -9
  361. package/lib/routing/router.js +12 -1
  362. package/lib/style-kernel.js +16 -6
  363. package/lib/video-trace-pool.js +128 -128
  364. package/package.json +1 -1
  365. package/LICENSE +0 -4175
@@ -1,311 +1,311 @@
1
- // cloner-depth-echo —— 克隆纵队(第二轮重设计 · 酸柠暗场 · 边缘部署)
2
- // 手法不变:一张主卡"复印"出 7 个克隆体沿纵深等距排开成队 → 停一拍让观众数清 → 全体同步加速吸回本体 → 合体弹一下。
3
- //
4
- // 设计决定
5
- // - look = lime(石墨黑 + 荧光黄绿)。主角是一张 video-shotcraft 渲染卡「launch-film」(顶栏 video-shotcraft 标志):
6
- // 大号 30fps 读数 + 柠檬绿折线 + 底部 8 个镜头位。语义从"多副本"落到具体卖点:一句提示词 = 8 个镜头同时出片。
7
- // - 纵深:真 3D 透视(perspective 1500),消失点放在左上——克隆体只做 translateZ 后退就自动排向左上,
8
- // 再叠一点 dx/dy 让纵队张开;越远越淡、越虚、越"只剩轮廓"(填充褪掉、柠檬绿描边留下),像 C4D Cloner 的线框回声。
9
- // 每个克隆体顶栏换成它自己的镜头号(S02 / S03 …)——同一配方、不同镜头。
10
- // - 版式:主卡右侧中位(占画宽 ~36%),纵队伸向左上;左下是全片的计数器「×8」(260px 柠檬绿 tabular),
11
- // 克隆每弹出一个它就滚一格;合体后左上空出的位置升起标题「One prompt. / Eight shots.」,尾帧是一张海报。
12
- // - 合体:8 个镜头位在吸回到达的同一帧全部点亮(克隆"回到"本体里),主卡 1→1.06→1 单脉冲 + 一次柠檬绿描边光(Q4 只给主角一次)。
13
- //
14
- // 时间表(30fps,共 138f)
15
- // 0–16 入场:主卡自下 40px 升起 + 由虚到实(snappy),卡内内容 2f 错峰;计数器 ×1 已在左下
16
- // 16–24 预备:主卡按压到 0.96、描边提亮("复印键按下")
17
- // 24–44 排开:7 个克隆 spring 错峰 2.2f/个弹向纵深(damping 15,一次轻过冲),每弹出一个计数 +1,顶栏镜头号同时浮现
18
- // 44–76 停 32f:相机极缓推近 2%、纵队整体轻微视差漂移——数得清"有很多个"
19
- // 76–86 吸回 10f:全体同步强 ease-in(越来越快),沿纵深方向按速度加拖影模糊
20
- // 86–104 合体:镜头位全亮、主卡单脉冲 1.06、描边光一次;计数器同帧一记缩放回弹
21
- // 92–118 标题逐词从线下升起(左上),副行淡入
22
- // 118–138 hold 20f:光的呼吸 + 0.6% 极缓推近,干净落定
23
- import React from 'react';
24
- import { AbsoluteFill, useCurrentFrame } from 'remotion';
25
- import { EASE, FONT, mix, ramp } from '../../_fixtures/Polish';
26
- import { LOOKS, Stage, Dust, TextReveal, alpha, glow, springAt, type } from '../../_fixtures/Look';
27
- import { ShotcraftMark } from '../../_fixtures/Brand';
28
-
29
- export const CLONER_DEPTH_ECHO_DURATION = 138;
30
-
31
- const L = LOOKS.lime;
32
- const N = 7; // 克隆数
33
- const GAP_Z = 250; // 相邻克隆的纵深间隔(px)
34
- const SPREAD = 24; // 排开起始帧
35
- const EACH = 2.2; // 克隆错峰(帧/个)
36
- const MERGE = 76; // 吸回起始帧
37
- const MERGE_DUR = 10;
38
- const LAND = MERGE + MERGE_DUR; // 合体帧 86
39
-
40
- // 主卡几何(屏幕 px,z=0 平面)
41
- const CW = 660;
42
- const CH = 420;
43
- const CX = 1130; // 左上角
44
- const CY = 352;
45
- // 透视:消失点在左上,克隆体后退即排向左上
46
- const PERSP = 1500;
47
- const VP = { x: 360, y: 120 };
48
-
49
- const TYPE_H1 = 112; // 标题字号(h1 档略收,两行放进左上空位)
50
-
51
- const REGIONS = ['S01', 'S02', 'S03', 'S04', 'S05', 'S06', 'S07', 'S08']; // 镜头号(沿用原变量名)
52
- const SPARK = [0.62, 0.58, 0.66, 0.52, 0.55, 0.44, 0.48, 0.36, 0.4, 0.3, 0.33, 0.26, 0.3, 0.22];
53
-
54
- const clamp01 = (x: number) => (x < 0 ? 0 : x > 1 ? 1 : x);
55
-
56
- // 第 idx(1..N)个克隆的排开进度:物理弹簧,错峰 EACH 帧
57
- const spreadOf = (f: number, idx: number) => (f < SPREAD + (idx - 1) * EACH ? 0 : springAt(f, SPREAD + (idx - 1) * EACH, { damping: 15, stiffness: 150, mass: 0.9 }));
58
- // 吸回:全体同步强 ease-in
59
- const mergeOf = (f: number) => ramp(f, MERGE, MERGE_DUR, EASE.exit);
60
- // 克隆的纵深位置(0 = 本体平面,1 = 排开位)
61
- const depthOf = (f: number, idx: number) => spreadOf(f, idx) * (1 - mergeOf(f));
62
-
63
- // ───────────── 实例卡 ─────────────
64
- const InstanceCard: React.FC<{ region: string; clone: number; lit: number; frame: number; inP: number }> = ({ region, clone, lit, frame, inP }) => {
65
- // clone: 0 = 本体,>0 越大越远 —— 越远填充越淡、只剩轮廓
66
- const c = clone / N;
67
- const fill = clone === 0 ? 1 : mix(0.55, 0.06, c);
68
- const rise = (k: number) => {
69
- const p = clone === 0 ? ramp(frame, 4 + k * 2, 14, EASE.snappy) : 1;
70
- return { opacity: p * inP + (1 - inP) * 0, transform: `translateY(${((1 - p) * 16).toFixed(2)}px)` };
71
- };
72
- const pts = SPARK.map((v, i) => `${(i / (SPARK.length - 1)) * 576},${(v * 120).toFixed(1)}`).join(' ');
73
- return (
74
- <div
75
- style={{
76
- position: 'absolute', inset: 0, borderRadius: 30, overflow: 'hidden',
77
- background: `linear-gradient(160deg, ${alpha('#20241a', fill)} 0%, ${alpha(L.surface, fill)} 60%, ${alpha('#0f110c', fill)} 100%)`,
78
- border: `1.5px solid ${clone === 0 ? alpha('#ffffff', 0.12) : alpha(L.accent, mix(0.55, 0.85, c))}`,
79
- boxShadow: clone === 0
80
- ? `inset 0 1px 0 ${alpha('#ffffff', 0.1)}, 0 40px 90px -30px ${alpha('#000000', 0.9)}, 0 12px 30px ${alpha('#000000', 0.5)}`
81
- : `0 0 ${(18 + 20 * c).toFixed(0)}px ${alpha(L.accent, 0.12 + 0.1 * c)}`,
82
- fontFamily: FONT.sans, color: L.ink,
83
- }}
84
- >
85
- {/* 卡面顶部受光:一道很淡的柠檬绿内光(只本体) */}
86
- {clone === 0 && (
87
- <div style={{ position: 'absolute', inset: 0, background: `radial-gradient(ellipse 70% 50% at 30% 0%, ${alpha(L.accent, 0.1)} 0%, transparent 70%)` }} />
88
- )}
89
- <div style={{ position: 'absolute', left: 42, right: 42, top: 36, display: 'flex', alignItems: 'center', gap: 14, ...rise(0) }}>
90
- {/* video-shotcraft 标志(暗底反白版);克隆体上随卡一起变淡 */}
91
- <ShotcraftMark size={34} tone="dark" style={{ margin: '-4px 0' }} />
92
- <div style={{ ...type(32, 600, { mono: true }), color: clone === 0 ? L.ink : alpha(L.ink, 0.85) }}>launch-film</div>
93
- <div style={{ flex: 1 }} />
94
- <div
95
- style={{
96
- ...type(26, 700, { mono: true }), height: 44, padding: '0 16px', borderRadius: 22, display: 'flex', alignItems: 'center',
97
- background: clone === 0 ? L.accent : alpha(L.accent, 0.14), color: clone === 0 ? L.onAccent : L.accent,
98
- border: clone === 0 ? 'none' : `1.5px solid ${alpha(L.accent, 0.6)}`,
99
- }}
100
- >
101
- {region}
102
- </div>
103
- </div>
104
- {/* 读数:30fps 出片 —— 克隆体上降成轮廓字(纹理),只有本体是实心 */}
105
- <div style={{ position: 'absolute', left: 40, top: 104, display: clone === 0 ? 'flex' : 'none', alignItems: 'baseline', gap: 16, ...rise(1) }}>
106
- <div
107
- style={{
108
- ...type(132, 750), letterSpacing: '-0.05em',
109
- color: clone === 0 ? L.ink : 'transparent',
110
- WebkitTextStroke: clone === 0 ? undefined : `1.5px ${alpha(L.accent, 0.7)}`,
111
- }}
112
- >
113
- 30<span style={{ fontSize: 72, letterSpacing: '-0.02em', color: clone === 0 ? L.ink2 : 'transparent' }}>fps</span>
114
- </div>
115
- <div style={{ ...type(26, 500, { caps: true }), color: L.ink3, letterSpacing: '0.12em', opacity: clone === 0 ? 1 : 0 }}>1080p</div>
116
- </div>
117
- {/* 折线 */}
118
- <svg width={576} height={130} style={{ position: 'absolute', left: 42, top: 246, overflow: 'visible', ...rise(2) }}>
119
- {clone === 0 && (
120
- <polygon points={`0,130 ${pts} 576,130`} fill={`url(#cdeFill)`} opacity={0.9} />
121
- )}
122
- <defs>
123
- <linearGradient id="cdeFill" x1="0" y1="0" x2="0" y2="1">
124
- <stop offset="0" stopColor={L.accent} stopOpacity={0.22} />
125
- <stop offset="1" stopColor={L.accent} stopOpacity={0} />
126
- </linearGradient>
127
- </defs>
128
- <polyline points={pts} fill="none" stroke={L.accent} strokeWidth={clone === 0 ? 4 : 2.5} strokeLinejoin="round" strokeLinecap="round" opacity={clone === 0 ? 1 : 0.8} />
129
- </svg>
130
- {/* 镜头位:本体底部 8 格,合体时全部点亮 */}
131
- {clone === 0 && (
132
- <div style={{ position: 'absolute', left: 42, right: 42, bottom: 30, display: 'flex', gap: 8, ...rise(3) }}>
133
- {REGIONS.map((r, i) => {
134
- const on = i === 0 ? 1 : lit;
135
- return (
136
- <div
137
- key={r}
138
- style={{
139
- flex: 1, height: 34, borderRadius: 8, display: 'flex', alignItems: 'center', justifyContent: 'center',
140
- ...type(18, 600, { mono: true }),
141
- background: alpha(L.accent, 0.06 + 0.84 * on),
142
- color: on > 0.5 ? L.onAccent : L.ink3,
143
- border: `1px solid ${alpha(L.accent, 0.18 + 0.5 * on)}`,
144
- }}
145
- >
146
- {r}
147
- </div>
148
- );
149
- })}
150
- </div>
151
- )}
152
- </div>
153
- );
154
- };
155
-
156
- // ───────────── 计数器:每一格从下滚上来 ─────────────
157
- const Counter: React.FC<{ value: number; tickAge: number; punch: number }> = ({ value, tickAge, punch }) => {
158
- // tickAge:距上一次 +1 过了几帧(滚动 5f);punch:合体回弹 0..1..0
159
- const roll = ramp(tickAge, 0, 5, EASE.snappy);
160
- const size = 260;
161
- return (
162
- <div style={{ display: 'flex', alignItems: 'flex-start', transform: `scale(${(1 + 0.06 * punch).toFixed(4)})`, transformOrigin: '0% 70%' }}>
163
- <span style={{ ...type(size * 0.62, 500), color: alpha(L.accent, 0.55), marginTop: size * 0.2, marginRight: 8 }}>×</span>
164
- {/* 不用 overflow 裁切(会把泛光裁出方框):出场格上移淡出、入场格自下升起淡入 */}
165
- <div style={{ position: 'relative', height: size * 1.02, width: size * 0.62 }}>
166
- {[value - 1, value].map((v, k) => {
167
- if (v < 1) return null;
168
- const y = k === 0 ? -roll * 45 : (1 - roll) * 45;
169
- // 滚动中两格都按速度竖向虚化(静止为 0)
170
- const spd = roll < 1 ? 1 - roll : 0;
171
- return (
172
- <div
173
- key={k}
174
- style={{
175
- position: 'absolute', left: 0, top: 0, ...type(size, 800), letterSpacing: '-0.04em', color: L.accent,
176
- transform: `translateY(${y.toFixed(2)}%)`, textShadow: glow(L.accent, 0.35 + 0.5 * punch),
177
- opacity: k === 0 ? clamp01(1 - roll * 1.6) : clamp01(roll * 1.6),
178
- filter: spd > 0.05 ? `blur(${(spd * 6).toFixed(2)}px)` : undefined,
179
- }}
180
- >
181
- {v}
182
- </div>
183
- );
184
- })}
185
- </div>
186
- </div>
187
- );
188
- };
189
-
190
- export const ClonerDepthEcho: React.FC = () => {
191
- const frame = useCurrentFrame();
192
-
193
- // 主卡入场 / 预备按压 / 合体脉冲
194
- const enter = ramp(frame, 0, 16, EASE.snappy);
195
- const press = ramp(frame, 16, 8, EASE.swift) * (1 - ramp(frame, SPREAD, 10, EASE.overshoot));
196
- const popT = clamp01((frame - LAND) / 16);
197
- const pop = frame >= LAND ? Math.sin(popT * Math.PI) * Math.pow(1 - popT, 0.6) : 0;
198
- const heroScale = (1 - 0.04 * press) * (1 + 0.06 * pop) * mix(0.94, 1, enter);
199
- const rimFlash = frame >= LAND ? Math.max(0, 1 - (frame - LAND) / 14) : 0;
200
- const lit = ramp(frame, LAND - 1, 5, EASE.snappy);
201
-
202
- // 计数:每个克隆弹出过 30% 就 +1;记录最近一次 +1 的帧给滚动用
203
- let count = 1;
204
- let lastTick = -99;
205
- for (let idx = 1; idx <= N; idx++) {
206
- const f0 = SPREAD + (idx - 1) * EACH + 2;
207
- if (frame >= f0) { count++; lastTick = f0; }
208
- }
209
- const counterPunch = frame >= LAND ? Math.sin(clamp01((frame - LAND) / 12) * Math.PI) : 0;
210
-
211
- // 相机:停留段极缓推近;合体后再极缓推进;纵队在停留段轻微视差漂移
212
- const dolly = 1 + 0.02 * ramp(frame, 40, 40, EASE.smooth) + 0.006 * ramp(frame, 100, 38, EASE.smooth);
213
- const drift = 14 * ramp(frame, 40, 40, EASE.smooth) * (1 - mergeOf(frame));
214
-
215
- // 标题 & 计数器标签
216
- const labelIn = ramp(frame, 6, 16, EASE.out);
217
-
218
- return (
219
- <AbsoluteFill style={{ fontFamily: FONT.sans, overflow: 'hidden' }}>
220
- <Stage look={L} keyLight={{ x: 0.62, y: 0.42 }} fill={{ x: 0.1, y: 0.95 }} breathe={0.6} intensity={0.45}>
221
- <Dust look={L} count={26} seed={5} drift={0.18} opacity={0.35} color={L.accent} />
222
- {/* 主卡脚下的柠檬绿地光 */}
223
- <div
224
- style={{
225
- position: 'absolute', left: CX - 160, top: CY + CH - 40, width: CW + 320, height: 220,
226
- background: `radial-gradient(ellipse 50% 50% at 50% 40%, ${alpha(L.accent, 0.14 + 0.12 * rimFlash)} 0%, transparent 70%)`,
227
- opacity: enter,
228
- }}
229
- />
230
- </Stage>
231
-
232
- {/* 相机层:推近以主卡中心为锚 */}
233
- <AbsoluteFill style={{ transform: `scale(${dolly.toFixed(5)})`, transformOrigin: `${CX + CW / 2}px ${CY + CH / 2}px` }}>
234
- <AbsoluteFill style={{ perspective: PERSP, perspectiveOrigin: `${VP.x}px ${VP.y}px` }}>
235
- <div style={{ position: 'absolute', inset: 0, transformStyle: 'preserve-3d' }}>
236
- {/* 克隆纵队:从远到近渲染,遮挡正确 */}
237
- {Array.from({ length: N }, (_, k) => N - k).map((idx) => {
238
- const d = depthOf(frame, idx);
239
- const sp = spreadOf(frame, idx);
240
- const op = (1 - (idx / N) * 0.72) * clamp01(sp * 2.5) * (1 - mergeOf(frame) * 0.4);
241
- if (op <= 0.005 || d <= 0.002) return null;
242
- const z = -GAP_Z * idx * d;
243
- const dx = (-58 * idx - drift * idx * 0.4) * d;
244
- const dy = -6 * idx * d;
245
- // 速度 → 拖影模糊(沿纵深的屏幕方向,近似用各向同性小模糊 + 方向拉伸)
246
- const v = Math.abs(depthOf(frame + 0.5, idx) - depthOf(frame - 0.5, idx)) * GAP_Z * idx;
247
- const blur = Math.min(10, v * 0.06);
248
- // 出生闪:弹出的前 8 帧描边更亮(一次复印的"啪")
249
- const born = clamp01(1 - (frame - (SPREAD + (idx - 1) * EACH)) / 8);
250
- return (
251
- <div
252
- key={idx}
253
- style={{
254
- position: 'absolute', left: CX, top: CY, width: CW, height: CH,
255
- transform: `translate3d(${dx.toFixed(2)}px, ${dy.toFixed(2)}px, ${z.toFixed(2)}px)`,
256
- opacity: op,
257
- filter: `blur(${(blur + (idx / N) * 1.6).toFixed(2)}px)${born > 0 ? ` drop-shadow(0 0 ${(14 * born).toFixed(1)}px ${alpha(L.accent, 0.7 * born)})` : ''}`,
258
- }}
259
- >
260
- <InstanceCard region={REGIONS[idx]} clone={idx} lit={0} frame={frame} inP={1} />
261
- </div>
262
- );
263
- })}
264
-
265
- {/* 本体 */}
266
- <div
267
- style={{
268
- position: 'absolute', left: CX, top: CY, width: CW, height: CH,
269
- transform: `translate3d(0px, ${((1 - enter) * 40).toFixed(2)}px, 0px) scale(${heroScale.toFixed(4)})`,
270
- opacity: clamp01(enter * 1.4),
271
- filter: enter < 1 ? `blur(${((1 - enter) * 10).toFixed(2)}px)` : undefined,
272
- }}
273
- >
274
- <InstanceCard region={REGIONS[0]} clone={0} lit={lit} frame={frame} inP={1} />
275
- {/* 合体描边光(一次,裁在圆角里) */}
276
- <div
277
- style={{
278
- position: 'absolute', inset: 0, borderRadius: 30, pointerEvents: 'none',
279
- border: `2px solid ${alpha(L.accent, 0.25 * press + 0.9 * rimFlash)}`,
280
- boxShadow: `0 0 ${(50 * rimFlash).toFixed(1)}px ${alpha(L.accent, 0.45 * rimFlash)}, inset 0 0 ${(40 * rimFlash).toFixed(1)}px ${alpha(L.accent, 0.18 * rimFlash)}`,
281
- }}
282
- />
283
- </div>
284
- </div>
285
- </AbsoluteFill>
286
- </AbsoluteFill>
287
-
288
- {/* 左上:合体后升起的标题 */}
289
- <div style={{ position: 'absolute', left: 140, top: 168, ...type(TYPE_H1, 780), color: L.ink }}>
290
- <TextReveal text={'One prompt.'} by="word" variant="rise" start={92} each={16} gap={4} />
291
- <br />
292
- <TextReveal text={'Eight shots.'} by="word" variant="rise" start={98} each={16} gap={4} unitStyle={(i) => (i === 1 ? { color: L.accent } : {})} />
293
- </div>
294
-
295
- {/* 左下:计数器 */}
296
- <div style={{ position: 'absolute', left: 128, top: 622, opacity: labelIn, transform: `translateY(${((1 - labelIn) * 20).toFixed(2)}px)` }}>
297
- <Counter value={count} tickAge={frame - lastTick} punch={counterPunch} />
298
- </div>
299
- <div
300
- style={{
301
- position: 'absolute', left: 140, top: 900, display: 'flex', alignItems: 'center', gap: 16,
302
- opacity: labelIn, ...type(32, 600, { mono: true }), color: L.ink2, letterSpacing: '0.04em',
303
- }}
304
- >
305
- <span style={{ width: 40, height: 2, background: L.accent }} />
306
- {count === 1 ? 'shot rendered' : 'shots rendered · one prompt'}
307
- </div>
308
- </AbsoluteFill>
309
- );
310
- };
311
-
1
+ // cloner-depth-echo —— 克隆纵队(第二轮重设计 · 酸柠暗场 · 边缘部署)
2
+ // 手法不变:一张主卡"复印"出 7 个克隆体沿纵深等距排开成队 → 停一拍让观众数清 → 全体同步加速吸回本体 → 合体弹一下。
3
+ //
4
+ // 设计决定
5
+ // - look = lime(石墨黑 + 荧光黄绿)。主角是一张 video-shotcraft 渲染卡「launch-film」(顶栏 video-shotcraft 标志):
6
+ // 大号 30fps 读数 + 柠檬绿折线 + 底部 8 个镜头位。语义从"多副本"落到具体卖点:一句提示词 = 8 个镜头同时出片。
7
+ // - 纵深:真 3D 透视(perspective 1500),消失点放在左上——克隆体只做 translateZ 后退就自动排向左上,
8
+ // 再叠一点 dx/dy 让纵队张开;越远越淡、越虚、越"只剩轮廓"(填充褪掉、柠檬绿描边留下),像 C4D Cloner 的线框回声。
9
+ // 每个克隆体顶栏换成它自己的镜头号(S02 / S03 …)——同一配方、不同镜头。
10
+ // - 版式:主卡右侧中位(占画宽 ~36%),纵队伸向左上;左下是全片的计数器「×8」(260px 柠檬绿 tabular),
11
+ // 克隆每弹出一个它就滚一格;合体后左上空出的位置升起标题「One prompt. / Eight shots.」,尾帧是一张海报。
12
+ // - 合体:8 个镜头位在吸回到达的同一帧全部点亮(克隆"回到"本体里),主卡 1→1.06→1 单脉冲 + 一次柠檬绿描边光(Q4 只给主角一次)。
13
+ //
14
+ // 时间表(30fps,共 138f)
15
+ // 0–16 入场:主卡自下 40px 升起 + 由虚到实(snappy),卡内内容 2f 错峰;计数器 ×1 已在左下
16
+ // 16–24 预备:主卡按压到 0.96、描边提亮("复印键按下")
17
+ // 24–44 排开:7 个克隆 spring 错峰 2.2f/个弹向纵深(damping 15,一次轻过冲),每弹出一个计数 +1,顶栏镜头号同时浮现
18
+ // 44–76 停 32f:相机极缓推近 2%、纵队整体轻微视差漂移——数得清"有很多个"
19
+ // 76–86 吸回 10f:全体同步强 ease-in(越来越快),沿纵深方向按速度加拖影模糊
20
+ // 86–104 合体:镜头位全亮、主卡单脉冲 1.06、描边光一次;计数器同帧一记缩放回弹
21
+ // 92–118 标题逐词从线下升起(左上),副行淡入
22
+ // 118–138 hold 20f:光的呼吸 + 0.6% 极缓推近,干净落定
23
+ import React from 'react';
24
+ import { AbsoluteFill, useCurrentFrame } from 'remotion';
25
+ import { EASE, FONT, mix, ramp } from '../../_fixtures/Polish';
26
+ import { LOOKS, Stage, Dust, TextReveal, alpha, glow, springAt, type } from '../../_fixtures/Look';
27
+ import { ShotcraftMark } from '../../_fixtures/Brand';
28
+
29
+ export const CLONER_DEPTH_ECHO_DURATION = 138;
30
+
31
+ const L = LOOKS.lime;
32
+ const N = 7; // 克隆数
33
+ const GAP_Z = 250; // 相邻克隆的纵深间隔(px)
34
+ const SPREAD = 24; // 排开起始帧
35
+ const EACH = 2.2; // 克隆错峰(帧/个)
36
+ const MERGE = 76; // 吸回起始帧
37
+ const MERGE_DUR = 10;
38
+ const LAND = MERGE + MERGE_DUR; // 合体帧 86
39
+
40
+ // 主卡几何(屏幕 px,z=0 平面)
41
+ const CW = 660;
42
+ const CH = 420;
43
+ const CX = 1130; // 左上角
44
+ const CY = 352;
45
+ // 透视:消失点在左上,克隆体后退即排向左上
46
+ const PERSP = 1500;
47
+ const VP = { x: 360, y: 120 };
48
+
49
+ const TYPE_H1 = 112; // 标题字号(h1 档略收,两行放进左上空位)
50
+
51
+ const REGIONS = ['S01', 'S02', 'S03', 'S04', 'S05', 'S06', 'S07', 'S08']; // 镜头号(沿用原变量名)
52
+ const SPARK = [0.62, 0.58, 0.66, 0.52, 0.55, 0.44, 0.48, 0.36, 0.4, 0.3, 0.33, 0.26, 0.3, 0.22];
53
+
54
+ const clamp01 = (x: number) => (x < 0 ? 0 : x > 1 ? 1 : x);
55
+
56
+ // 第 idx(1..N)个克隆的排开进度:物理弹簧,错峰 EACH 帧
57
+ const spreadOf = (f: number, idx: number) => (f < SPREAD + (idx - 1) * EACH ? 0 : springAt(f, SPREAD + (idx - 1) * EACH, { damping: 15, stiffness: 150, mass: 0.9 }));
58
+ // 吸回:全体同步强 ease-in
59
+ const mergeOf = (f: number) => ramp(f, MERGE, MERGE_DUR, EASE.exit);
60
+ // 克隆的纵深位置(0 = 本体平面,1 = 排开位)
61
+ const depthOf = (f: number, idx: number) => spreadOf(f, idx) * (1 - mergeOf(f));
62
+
63
+ // ───────────── 实例卡 ─────────────
64
+ const InstanceCard: React.FC<{ region: string; clone: number; lit: number; frame: number; inP: number }> = ({ region, clone, lit, frame, inP }) => {
65
+ // clone: 0 = 本体,>0 越大越远 —— 越远填充越淡、只剩轮廓
66
+ const c = clone / N;
67
+ const fill = clone === 0 ? 1 : mix(0.55, 0.06, c);
68
+ const rise = (k: number) => {
69
+ const p = clone === 0 ? ramp(frame, 4 + k * 2, 14, EASE.snappy) : 1;
70
+ return { opacity: p * inP + (1 - inP) * 0, transform: `translateY(${((1 - p) * 16).toFixed(2)}px)` };
71
+ };
72
+ const pts = SPARK.map((v, i) => `${(i / (SPARK.length - 1)) * 576},${(v * 120).toFixed(1)}`).join(' ');
73
+ return (
74
+ <div
75
+ style={{
76
+ position: 'absolute', inset: 0, borderRadius: 30, overflow: 'hidden',
77
+ background: `linear-gradient(160deg, ${alpha('#20241a', fill)} 0%, ${alpha(L.surface, fill)} 60%, ${alpha('#0f110c', fill)} 100%)`,
78
+ border: `1.5px solid ${clone === 0 ? alpha('#ffffff', 0.12) : alpha(L.accent, mix(0.55, 0.85, c))}`,
79
+ boxShadow: clone === 0
80
+ ? `inset 0 1px 0 ${alpha('#ffffff', 0.1)}, 0 40px 90px -30px ${alpha('#000000', 0.9)}, 0 12px 30px ${alpha('#000000', 0.5)}`
81
+ : `0 0 ${(18 + 20 * c).toFixed(0)}px ${alpha(L.accent, 0.12 + 0.1 * c)}`,
82
+ fontFamily: FONT.sans, color: L.ink,
83
+ }}
84
+ >
85
+ {/* 卡面顶部受光:一道很淡的柠檬绿内光(只本体) */}
86
+ {clone === 0 && (
87
+ <div style={{ position: 'absolute', inset: 0, background: `radial-gradient(ellipse 70% 50% at 30% 0%, ${alpha(L.accent, 0.1)} 0%, transparent 70%)` }} />
88
+ )}
89
+ <div style={{ position: 'absolute', left: 42, right: 42, top: 36, display: 'flex', alignItems: 'center', gap: 14, ...rise(0) }}>
90
+ {/* video-shotcraft 标志(暗底反白版);克隆体上随卡一起变淡 */}
91
+ <ShotcraftMark size={34} tone="dark" style={{ margin: '-4px 0' }} />
92
+ <div style={{ ...type(32, 600, { mono: true }), color: clone === 0 ? L.ink : alpha(L.ink, 0.85) }}>launch-film</div>
93
+ <div style={{ flex: 1 }} />
94
+ <div
95
+ style={{
96
+ ...type(26, 700, { mono: true }), height: 44, padding: '0 16px', borderRadius: 22, display: 'flex', alignItems: 'center',
97
+ background: clone === 0 ? L.accent : alpha(L.accent, 0.14), color: clone === 0 ? L.onAccent : L.accent,
98
+ border: clone === 0 ? 'none' : `1.5px solid ${alpha(L.accent, 0.6)}`,
99
+ }}
100
+ >
101
+ {region}
102
+ </div>
103
+ </div>
104
+ {/* 读数:30fps 出片 —— 克隆体上降成轮廓字(纹理),只有本体是实心 */}
105
+ <div style={{ position: 'absolute', left: 40, top: 104, display: clone === 0 ? 'flex' : 'none', alignItems: 'baseline', gap: 16, ...rise(1) }}>
106
+ <div
107
+ style={{
108
+ ...type(132, 750), letterSpacing: '-0.05em',
109
+ color: clone === 0 ? L.ink : 'transparent',
110
+ WebkitTextStroke: clone === 0 ? undefined : `1.5px ${alpha(L.accent, 0.7)}`,
111
+ }}
112
+ >
113
+ 30<span style={{ fontSize: 72, letterSpacing: '-0.02em', color: clone === 0 ? L.ink2 : 'transparent' }}>fps</span>
114
+ </div>
115
+ <div style={{ ...type(26, 500, { caps: true }), color: L.ink3, letterSpacing: '0.12em', opacity: clone === 0 ? 1 : 0 }}>1080p</div>
116
+ </div>
117
+ {/* 折线 */}
118
+ <svg width={576} height={130} style={{ position: 'absolute', left: 42, top: 246, overflow: 'visible', ...rise(2) }}>
119
+ {clone === 0 && (
120
+ <polygon points={`0,130 ${pts} 576,130`} fill={`url(#cdeFill)`} opacity={0.9} />
121
+ )}
122
+ <defs>
123
+ <linearGradient id="cdeFill" x1="0" y1="0" x2="0" y2="1">
124
+ <stop offset="0" stopColor={L.accent} stopOpacity={0.22} />
125
+ <stop offset="1" stopColor={L.accent} stopOpacity={0} />
126
+ </linearGradient>
127
+ </defs>
128
+ <polyline points={pts} fill="none" stroke={L.accent} strokeWidth={clone === 0 ? 4 : 2.5} strokeLinejoin="round" strokeLinecap="round" opacity={clone === 0 ? 1 : 0.8} />
129
+ </svg>
130
+ {/* 镜头位:本体底部 8 格,合体时全部点亮 */}
131
+ {clone === 0 && (
132
+ <div style={{ position: 'absolute', left: 42, right: 42, bottom: 30, display: 'flex', gap: 8, ...rise(3) }}>
133
+ {REGIONS.map((r, i) => {
134
+ const on = i === 0 ? 1 : lit;
135
+ return (
136
+ <div
137
+ key={r}
138
+ style={{
139
+ flex: 1, height: 34, borderRadius: 8, display: 'flex', alignItems: 'center', justifyContent: 'center',
140
+ ...type(18, 600, { mono: true }),
141
+ background: alpha(L.accent, 0.06 + 0.84 * on),
142
+ color: on > 0.5 ? L.onAccent : L.ink3,
143
+ border: `1px solid ${alpha(L.accent, 0.18 + 0.5 * on)}`,
144
+ }}
145
+ >
146
+ {r}
147
+ </div>
148
+ );
149
+ })}
150
+ </div>
151
+ )}
152
+ </div>
153
+ );
154
+ };
155
+
156
+ // ───────────── 计数器:每一格从下滚上来 ─────────────
157
+ const Counter: React.FC<{ value: number; tickAge: number; punch: number }> = ({ value, tickAge, punch }) => {
158
+ // tickAge:距上一次 +1 过了几帧(滚动 5f);punch:合体回弹 0..1..0
159
+ const roll = ramp(tickAge, 0, 5, EASE.snappy);
160
+ const size = 260;
161
+ return (
162
+ <div style={{ display: 'flex', alignItems: 'flex-start', transform: `scale(${(1 + 0.06 * punch).toFixed(4)})`, transformOrigin: '0% 70%' }}>
163
+ <span style={{ ...type(size * 0.62, 500), color: alpha(L.accent, 0.55), marginTop: size * 0.2, marginRight: 8 }}>×</span>
164
+ {/* 不用 overflow 裁切(会把泛光裁出方框):出场格上移淡出、入场格自下升起淡入 */}
165
+ <div style={{ position: 'relative', height: size * 1.02, width: size * 0.62 }}>
166
+ {[value - 1, value].map((v, k) => {
167
+ if (v < 1) return null;
168
+ const y = k === 0 ? -roll * 45 : (1 - roll) * 45;
169
+ // 滚动中两格都按速度竖向虚化(静止为 0)
170
+ const spd = roll < 1 ? 1 - roll : 0;
171
+ return (
172
+ <div
173
+ key={k}
174
+ style={{
175
+ position: 'absolute', left: 0, top: 0, ...type(size, 800), letterSpacing: '-0.04em', color: L.accent,
176
+ transform: `translateY(${y.toFixed(2)}%)`, textShadow: glow(L.accent, 0.35 + 0.5 * punch),
177
+ opacity: k === 0 ? clamp01(1 - roll * 1.6) : clamp01(roll * 1.6),
178
+ filter: spd > 0.05 ? `blur(${(spd * 6).toFixed(2)}px)` : undefined,
179
+ }}
180
+ >
181
+ {v}
182
+ </div>
183
+ );
184
+ })}
185
+ </div>
186
+ </div>
187
+ );
188
+ };
189
+
190
+ export const ClonerDepthEcho: React.FC = () => {
191
+ const frame = useCurrentFrame();
192
+
193
+ // 主卡入场 / 预备按压 / 合体脉冲
194
+ const enter = ramp(frame, 0, 16, EASE.snappy);
195
+ const press = ramp(frame, 16, 8, EASE.swift) * (1 - ramp(frame, SPREAD, 10, EASE.overshoot));
196
+ const popT = clamp01((frame - LAND) / 16);
197
+ const pop = frame >= LAND ? Math.sin(popT * Math.PI) * Math.pow(1 - popT, 0.6) : 0;
198
+ const heroScale = (1 - 0.04 * press) * (1 + 0.06 * pop) * mix(0.94, 1, enter);
199
+ const rimFlash = frame >= LAND ? Math.max(0, 1 - (frame - LAND) / 14) : 0;
200
+ const lit = ramp(frame, LAND - 1, 5, EASE.snappy);
201
+
202
+ // 计数:每个克隆弹出过 30% 就 +1;记录最近一次 +1 的帧给滚动用
203
+ let count = 1;
204
+ let lastTick = -99;
205
+ for (let idx = 1; idx <= N; idx++) {
206
+ const f0 = SPREAD + (idx - 1) * EACH + 2;
207
+ if (frame >= f0) { count++; lastTick = f0; }
208
+ }
209
+ const counterPunch = frame >= LAND ? Math.sin(clamp01((frame - LAND) / 12) * Math.PI) : 0;
210
+
211
+ // 相机:停留段极缓推近;合体后再极缓推进;纵队在停留段轻微视差漂移
212
+ const dolly = 1 + 0.02 * ramp(frame, 40, 40, EASE.smooth) + 0.006 * ramp(frame, 100, 38, EASE.smooth);
213
+ const drift = 14 * ramp(frame, 40, 40, EASE.smooth) * (1 - mergeOf(frame));
214
+
215
+ // 标题 & 计数器标签
216
+ const labelIn = ramp(frame, 6, 16, EASE.out);
217
+
218
+ return (
219
+ <AbsoluteFill style={{ fontFamily: FONT.sans, overflow: 'hidden' }}>
220
+ <Stage look={L} keyLight={{ x: 0.62, y: 0.42 }} fill={{ x: 0.1, y: 0.95 }} breathe={0.6} intensity={0.45}>
221
+ <Dust look={L} count={26} seed={5} drift={0.18} opacity={0.35} color={L.accent} />
222
+ {/* 主卡脚下的柠檬绿地光 */}
223
+ <div
224
+ style={{
225
+ position: 'absolute', left: CX - 160, top: CY + CH - 40, width: CW + 320, height: 220,
226
+ background: `radial-gradient(ellipse 50% 50% at 50% 40%, ${alpha(L.accent, 0.14 + 0.12 * rimFlash)} 0%, transparent 70%)`,
227
+ opacity: enter,
228
+ }}
229
+ />
230
+ </Stage>
231
+
232
+ {/* 相机层:推近以主卡中心为锚 */}
233
+ <AbsoluteFill style={{ transform: `scale(${dolly.toFixed(5)})`, transformOrigin: `${CX + CW / 2}px ${CY + CH / 2}px` }}>
234
+ <AbsoluteFill style={{ perspective: PERSP, perspectiveOrigin: `${VP.x}px ${VP.y}px` }}>
235
+ <div style={{ position: 'absolute', inset: 0, transformStyle: 'preserve-3d' }}>
236
+ {/* 克隆纵队:从远到近渲染,遮挡正确 */}
237
+ {Array.from({ length: N }, (_, k) => N - k).map((idx) => {
238
+ const d = depthOf(frame, idx);
239
+ const sp = spreadOf(frame, idx);
240
+ const op = (1 - (idx / N) * 0.72) * clamp01(sp * 2.5) * (1 - mergeOf(frame) * 0.4);
241
+ if (op <= 0.005 || d <= 0.002) return null;
242
+ const z = -GAP_Z * idx * d;
243
+ const dx = (-58 * idx - drift * idx * 0.4) * d;
244
+ const dy = -6 * idx * d;
245
+ // 速度 → 拖影模糊(沿纵深的屏幕方向,近似用各向同性小模糊 + 方向拉伸)
246
+ const v = Math.abs(depthOf(frame + 0.5, idx) - depthOf(frame - 0.5, idx)) * GAP_Z * idx;
247
+ const blur = Math.min(10, v * 0.06);
248
+ // 出生闪:弹出的前 8 帧描边更亮(一次复印的"啪")
249
+ const born = clamp01(1 - (frame - (SPREAD + (idx - 1) * EACH)) / 8);
250
+ return (
251
+ <div
252
+ key={idx}
253
+ style={{
254
+ position: 'absolute', left: CX, top: CY, width: CW, height: CH,
255
+ transform: `translate3d(${dx.toFixed(2)}px, ${dy.toFixed(2)}px, ${z.toFixed(2)}px)`,
256
+ opacity: op,
257
+ filter: `blur(${(blur + (idx / N) * 1.6).toFixed(2)}px)${born > 0 ? ` drop-shadow(0 0 ${(14 * born).toFixed(1)}px ${alpha(L.accent, 0.7 * born)})` : ''}`,
258
+ }}
259
+ >
260
+ <InstanceCard region={REGIONS[idx]} clone={idx} lit={0} frame={frame} inP={1} />
261
+ </div>
262
+ );
263
+ })}
264
+
265
+ {/* 本体 */}
266
+ <div
267
+ style={{
268
+ position: 'absolute', left: CX, top: CY, width: CW, height: CH,
269
+ transform: `translate3d(0px, ${((1 - enter) * 40).toFixed(2)}px, 0px) scale(${heroScale.toFixed(4)})`,
270
+ opacity: clamp01(enter * 1.4),
271
+ filter: enter < 1 ? `blur(${((1 - enter) * 10).toFixed(2)}px)` : undefined,
272
+ }}
273
+ >
274
+ <InstanceCard region={REGIONS[0]} clone={0} lit={lit} frame={frame} inP={1} />
275
+ {/* 合体描边光(一次,裁在圆角里) */}
276
+ <div
277
+ style={{
278
+ position: 'absolute', inset: 0, borderRadius: 30, pointerEvents: 'none',
279
+ border: `2px solid ${alpha(L.accent, 0.25 * press + 0.9 * rimFlash)}`,
280
+ boxShadow: `0 0 ${(50 * rimFlash).toFixed(1)}px ${alpha(L.accent, 0.45 * rimFlash)}, inset 0 0 ${(40 * rimFlash).toFixed(1)}px ${alpha(L.accent, 0.18 * rimFlash)}`,
281
+ }}
282
+ />
283
+ </div>
284
+ </div>
285
+ </AbsoluteFill>
286
+ </AbsoluteFill>
287
+
288
+ {/* 左上:合体后升起的标题 */}
289
+ <div style={{ position: 'absolute', left: 140, top: 168, ...type(TYPE_H1, 780), color: L.ink }}>
290
+ <TextReveal text={'One prompt.'} by="word" variant="rise" start={92} each={16} gap={4} />
291
+ <br />
292
+ <TextReveal text={'Eight shots.'} by="word" variant="rise" start={98} each={16} gap={4} unitStyle={(i) => (i === 1 ? { color: L.accent } : {})} />
293
+ </div>
294
+
295
+ {/* 左下:计数器 */}
296
+ <div style={{ position: 'absolute', left: 128, top: 622, opacity: labelIn, transform: `translateY(${((1 - labelIn) * 20).toFixed(2)}px)` }}>
297
+ <Counter value={count} tickAge={frame - lastTick} punch={counterPunch} />
298
+ </div>
299
+ <div
300
+ style={{
301
+ position: 'absolute', left: 140, top: 900, display: 'flex', alignItems: 'center', gap: 16,
302
+ opacity: labelIn, ...type(32, 600, { mono: true }), color: L.ink2, letterSpacing: '0.04em',
303
+ }}
304
+ >
305
+ <span style={{ width: 40, height: 2, background: L.accent }} />
306
+ {count === 1 ? 'shot rendered' : 'shots rendered · one prompt'}
307
+ </div>
308
+ </AbsoluteFill>
309
+ );
310
+ };
311
+