dsh-drawai 0.4.2 → 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 (366) hide show
  1. package/README.md +4 -3
  2. package/lib/index.js +7777 -7719
  3. package/lib/motion/asset-pack.js +394 -394
  4. package/lib/motion/assets.js +291 -291
  5. package/lib/motion/demo-assets-lock.js +10 -10
  6. package/lib/motion/mgstyles/vendor/README.md +28 -28
  7. package/lib/motion/mgstyles/vendor/modules/d3/LICENSE +13 -13
  8. package/lib/motion/mgstyles/vendor/modules/d3/dist/d3.min.js +2 -2
  9. package/lib/motion/mgstyles/vendor/modules/opentype.js/LICENSE +20 -20
  10. package/lib/motion/mgstyles/vendor/modules/opentype.js/dist/opentype.mjs +14460 -14460
  11. package/lib/motion/mgstyles/vendor/modules/simplex-noise/LICENSE +21 -21
  12. package/lib/motion/mgstyles/vendor/modules/simplex-noise/dist/esm/simplex-noise.js +465 -465
  13. package/lib/motion/mgstyles/vendor/modules/topojson-client/LICENSE +13 -13
  14. package/lib/motion/mgstyles/vendor/modules/topojson-client/dist/topojson-client.min.js +2 -2
  15. package/lib/motion/render.js +179 -179
  16. package/lib/motion/shotcraft/upstream/SKILL.md +286 -286
  17. package/lib/motion/shotcraft/upstream/assets/lib/Caption.tsx +54 -54
  18. package/lib/motion/shotcraft/upstream/assets/lib/ClipCard.tsx +200 -200
  19. package/lib/motion/shotcraft/upstream/assets/lib/DigitRoll.tsx +45 -45
  20. package/lib/motion/shotcraft/upstream/assets/lib/FlashCut.tsx +20 -20
  21. package/lib/motion/shotcraft/upstream/assets/lib/FlatPanel.tsx +65 -65
  22. package/lib/motion/shotcraft/upstream/assets/lib/PageCam.tsx +151 -151
  23. package/lib/motion/shotcraft/upstream/assets/lib/VerticalTicker.tsx +129 -129
  24. package/lib/motion/shotcraft/upstream/assets/lib/helpers/camera.tsx +75 -75
  25. package/lib/motion/shotcraft/upstream/assets/lib/helpers/motion.ts +40 -40
  26. package/lib/motion/shotcraft/upstream/assets/lib/helpers/rand.ts +11 -11
  27. package/lib/motion/shotcraft/upstream/assets/lib/helpers/shake.ts +10 -10
  28. package/lib/motion/shotcraft/upstream/assets/scripts/build-readme-cover.mjs +49 -49
  29. package/lib/motion/shotcraft/upstream/assets/scripts/capture-template.mjs +210 -210
  30. package/lib/motion/shotcraft/upstream/assets/scripts/sfx-source.py +423 -423
  31. package/lib/motion/shotcraft/upstream/assets/scripts/smoke-render-demos.py +170 -170
  32. package/lib/motion/shotcraft/upstream/assets/scripts/test_sfx_source.py +157 -157
  33. package/lib/motion/shotcraft/upstream/demos/README.md +120 -120
  34. package/lib/motion/shotcraft/upstream/demos/_fixtures/Brand.tsx +112 -112
  35. package/lib/motion/shotcraft/upstream/demos/_fixtures/Fixtures.tsx +647 -647
  36. package/lib/motion/shotcraft/upstream/demos/_fixtures/Look.tsx +316 -316
  37. package/lib/motion/shotcraft/upstream/demos/_fixtures/Motion.tsx +82 -82
  38. package/lib/motion/shotcraft/upstream/demos/_fixtures/PageCam2D.tsx +115 -115
  39. package/lib/motion/shotcraft/upstream/demos/_fixtures/Polish.tsx +243 -243
  40. package/lib/motion/shotcraft/upstream/demos/_textures/live-layout.json +388 -388
  41. package/lib/motion/shotcraft/upstream/demos/camera/basic-3d-scene/Basic3DScene.tsx +250 -250
  42. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashImpactReal.tsx +305 -305
  43. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashZoomReal.tsx +246 -246
  44. package/lib/motion/shotcraft/upstream/demos/camera/cursor-flyover/CursorFlyover.tsx +390 -390
  45. package/lib/motion/shotcraft/upstream/demos/camera/depth-layer-moves/MultiplaneReal.tsx +138 -138
  46. package/lib/motion/shotcraft/upstream/demos/camera/graze-face-tour/GrazeFaceTour.tsx +542 -542
  47. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/OverheadTabletopDrop.tsx +315 -315
  48. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/TiltReveal.tsx +299 -299
  49. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/DroneDiveLanding.tsx +173 -173
  50. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/ExplodedView.tsx +348 -348
  51. package/lib/motion/shotcraft/upstream/demos/camera/steep-tilt-glide/SteepTiltGlide.tsx +366 -366
  52. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx +279 -279
  53. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/PullBackIsolation.tsx +184 -184
  54. package/lib/motion/shotcraft/upstream/demos/camera/terminal-3d/Terminal3D.tsx +390 -390
  55. package/lib/motion/shotcraft/upstream/demos/data/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +155 -155
  56. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/AxisRescaleShockV2.tsx +303 -303
  57. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/OscilloscopeStreamV2.tsx +290 -290
  58. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/UnitDotSwarmRegroupV2.tsx +278 -278
  59. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/NeedleSweepSelftest.tsx +307 -307
  60. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/TapeScrollFixedPointer.tsx +215 -215
  61. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/BrakeReticleLock.tsx +299 -299
  62. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/ChangelogScrollBrake.tsx +232 -232
  63. package/lib/motion/shotcraft/upstream/demos/data/timeline-travel/TimelineTravel.tsx +290 -290
  64. package/lib/motion/shotcraft/upstream/demos/effects/assemble-then-type-flyin/AssembleThenTypeFlyin.tsx +273 -273
  65. package/lib/motion/shotcraft/upstream/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx +167 -167
  66. package/lib/motion/shotcraft/upstream/demos/effects/brand-frame-snap/BrandFrameSnap.tsx +536 -536
  67. package/lib/motion/shotcraft/upstream/demos/effects/fui-hud-moves/ReticleLockOn.tsx +164 -164
  68. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/FlylineArc.tsx +175 -175
  69. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/GlowOrbAmbient.tsx +197 -197
  70. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/OrbFlylineRelay.tsx +241 -241
  71. package/lib/motion/shotcraft/upstream/demos/effects/icon-performance-moves/AttentionBounce.tsx +279 -279
  72. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/AnimeImpact.tsx +230 -230
  73. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/HitCounter.tsx +345 -345
  74. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SheenSweepRetry.tsx +275 -275
  75. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SpotlightSweepReveal.tsx +229 -229
  76. package/lib/motion/shotcraft/upstream/demos/effects/radial-ripple-phone-chips/RadialRipplePhoneChips.tsx +312 -312
  77. package/lib/motion/shotcraft/upstream/demos/effects/riso-print-hits/RisoMisregistrationHit.tsx +222 -222
  78. package/lib/motion/shotcraft/upstream/demos/effects/scan-bracket-sweep/ScanBracketSweep.tsx +295 -295
  79. package/lib/motion/shotcraft/upstream/demos/effects/scanline-annotate-focus/ScanlineAnnotateFocus.tsx +329 -329
  80. package/lib/motion/shotcraft/upstream/demos/effects/scanline-assemble-flyin/ScanlineAssembleFlyin.tsx +315 -315
  81. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ImpactBurstKit.tsx +264 -264
  82. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/KanadaPerspectiveSnap.tsx +260 -260
  83. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ScoreSlam.tsx +263 -263
  84. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/CornerSpotlightReveal.tsx +123 -123
  85. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +187 -187
  86. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/SlideSpotlightPan.tsx +175 -175
  87. package/lib/motion/shotcraft/upstream/demos/interaction/autolayout-gap-dial/AutolayoutGapDial.tsx +305 -305
  88. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/DiagramCascadeBuild.tsx +350 -350
  89. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +352 -352
  90. package/lib/motion/shotcraft/upstream/demos/interaction/chip-grid-single-select-blackout/ChipGridSingleSelectBlackout.tsx +218 -218
  91. package/lib/motion/shotcraft/upstream/demos/interaction/collab-cursor-moves/CursorCastEnsemble.tsx +297 -297
  92. package/lib/motion/shotcraft/upstream/demos/interaction/glass-pill-dictation-typing/GlassPillDictationTyping.tsx +157 -157
  93. package/lib/motion/shotcraft/upstream/demos/interaction/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +218 -218
  94. package/lib/motion/shotcraft/upstream/demos/interaction/picker-carousel-feature-cycle/PickerCarouselFeatureCycle.tsx +202 -202
  95. package/lib/motion/shotcraft/upstream/demos/interaction/segmented-thumb-hero/SegmentedThumbHero.tsx +265 -265
  96. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/PaletteThemeRipple.tsx +457 -457
  97. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/ThemeSweepToggle.tsx +446 -446
  98. package/lib/motion/shotcraft/upstream/demos/interaction/type-and-filter/TypeAndFilter.tsx +249 -249
  99. package/lib/motion/shotcraft/upstream/demos/interaction/voice-waveform-live/VoiceWaveformLive.tsx +278 -278
  100. package/lib/motion/shotcraft/upstream/demos/opening/crane-rise-reveal/CraneRiseReveal.tsx +332 -332
  101. package/lib/motion/shotcraft/upstream/demos/opening/dataviz-landscape-open/DatavizLandscapeOpen.tsx +358 -358
  102. package/lib/motion/shotcraft/upstream/demos/opening/fracture/Fracture.tsx +201 -201
  103. package/lib/motion/shotcraft/upstream/demos/opening/icon-field-colorize/IconFieldColorize.tsx +200 -200
  104. package/lib/motion/shotcraft/upstream/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx +208 -208
  105. package/lib/motion/shotcraft/upstream/demos/opening/magician-card-flourish/MagicianCardFlourish.tsx +341 -341
  106. package/lib/motion/shotcraft/upstream/demos/opening/orbit-ring-title-open/OrbitRingTitleOpen.tsx +389 -389
  107. package/lib/motion/shotcraft/upstream/demos/opening/spotlight-hero-card/SpotlightHeroCard.tsx +293 -293
  108. package/lib/motion/shotcraft/upstream/demos/opening/stroke-segment-build/StrokeSegmentBuild.tsx +183 -183
  109. package/lib/motion/shotcraft/upstream/demos/opening/text-as-mask/TextAsMask.tsx +245 -245
  110. package/lib/motion/shotcraft/upstream/demos/outro/grain-dissolve/GrainDissolve.tsx +222 -222
  111. package/lib/motion/shotcraft/upstream/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx +223 -223
  112. package/lib/motion/shotcraft/upstream/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx +217 -217
  113. package/lib/motion/shotcraft/upstream/demos/outro/outro-group-photo-launch/OutroGroupPhotoLaunch.tsx +343 -343
  114. package/lib/motion/shotcraft/upstream/demos/outro/ui-strip-away-outro/UiStripAwayOutro.tsx +357 -357
  115. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/IconFlipBloomLogo.tsx +187 -187
  116. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/InputMorphsIntoLogo.tsx +333 -333
  117. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-cut-moves/PaparazziFlash.tsx +274 -274
  118. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +270 -270
  119. package/lib/motion/shotcraft/upstream/demos/rhythm/panel-grid-moves/ComicPanelSplit.tsx +430 -430
  120. package/lib/motion/shotcraft/upstream/demos/rhythm/quad-split-parallel-scenes/QuadSplitParallelScenes.tsx +252 -252
  121. package/lib/motion/shotcraft/upstream/demos/rhythm/rhythm-interrupt-moves/JumpCutPunchIn.tsx +106 -106
  122. package/lib/motion/shotcraft/upstream/demos/rhythm/sakuga-timing-shift/SakugaTimingShift.tsx +288 -288
  123. package/lib/motion/shotcraft/upstream/demos/rhythm/speed-ramp-freeze/FreezeAnnotateReal.tsx +362 -362
  124. package/lib/motion/shotcraft/upstream/demos/rhythm/trailer-grammar-moves/TrailerBumper.tsx +168 -168
  125. package/lib/motion/shotcraft/upstream/demos/transition/bottom-push-stack-wipe/BottomPushStackWipe.tsx +310 -310
  126. package/lib/motion/shotcraft/upstream/demos/transition/card-flip-reveal/CardFlipReveal.tsx +261 -261
  127. package/lib/motion/shotcraft/upstream/demos/transition/card-flock-tumble/CardFlockTumble.tsx +459 -459
  128. package/lib/motion/shotcraft/upstream/demos/transition/circle-match-iris/CircleMatchIris.tsx +294 -294
  129. package/lib/motion/shotcraft/upstream/demos/transition/gradient-transition/GradientTransition.tsx +161 -161
  130. package/lib/motion/shotcraft/upstream/demos/transition/line-carry-transition/LineCarryTransition.tsx +248 -248
  131. package/lib/motion/shotcraft/upstream/demos/transition/mosaic-reframe/MosaicReframe.tsx +359 -359
  132. package/lib/motion/shotcraft/upstream/demos/transition/page-turn-transitions/BarnDoorSplit.tsx +227 -227
  133. package/lib/motion/shotcraft/upstream/demos/transition/print-texture-transitions/InkBleedReveal.tsx +162 -162
  134. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/PortalWipeV2.tsx +248 -248
  135. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/WhipBrakeReal.tsx +186 -186
  136. package/lib/motion/shotcraft/upstream/demos/transition/tear-streak-transitions/GlitchDisplace.tsx +355 -355
  137. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/InvisibleCut.tsx +272 -272
  138. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/LightLeakBurn.tsx +262 -262
  139. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/VersusSlam.tsx +217 -217
  140. package/lib/motion/shotcraft/upstream/demos/transition/transition-travel/LetterformZoom.tsx +285 -285
  141. package/lib/motion/shotcraft/upstream/demos/transition/white-flash-logo-simplify-cut/WhiteFlashLogoSimplifyCut.tsx +205 -205
  142. package/lib/motion/shotcraft/upstream/demos/transition/wipe-transitions/BlindsSlice.tsx +178 -178
  143. package/lib/motion/shotcraft/upstream/demos/typography/blur-slide/BlurSlide.tsx +147 -147
  144. package/lib/motion/shotcraft/upstream/demos/typography/brace-expand/BraceExpand.tsx +143 -143
  145. package/lib/motion/shotcraft/upstream/demos/typography/brand-ink-open/BrandInkOpen.tsx +134 -134
  146. package/lib/motion/shotcraft/upstream/demos/typography/countdown-arc-scatter/CountdownArcScatter.tsx +217 -217
  147. package/lib/motion/shotcraft/upstream/demos/typography/flying-words/FlyingWords.tsx +198 -198
  148. package/lib/motion/shotcraft/upstream/demos/typography/glitch-cycle/GlitchCycle.tsx +221 -221
  149. package/lib/motion/shotcraft/upstream/demos/typography/gradient-word-sweep/GradientWordSweep.tsx +312 -312
  150. package/lib/motion/shotcraft/upstream/demos/typography/lead-word-zoom-assemble/LeadWordZoomAssemble.tsx +261 -261
  151. package/lib/motion/shotcraft/upstream/demos/typography/marker-underline-title/MarkerUnderlineTitle.tsx +121 -121
  152. package/lib/motion/shotcraft/upstream/demos/typography/outline-word-fill/OutlineWordFill.tsx +153 -153
  153. package/lib/motion/shotcraft/upstream/demos/typography/paper-title-card/PaperTitleCard.tsx +179 -179
  154. package/lib/motion/shotcraft/upstream/demos/typography/pill-chip-slot-cycle-handled/PillChipSlotCycleHandled.tsx +140 -140
  155. package/lib/motion/shotcraft/upstream/demos/typography/pill-slot-cycle/PillSlotCycle.tsx +309 -309
  156. package/lib/motion/shotcraft/upstream/demos/typography/text-column-converge/TextColumnConverge.tsx +191 -191
  157. package/lib/motion/shotcraft/upstream/demos/typography/title-demote-to-label/TitleDemoteToLabel.tsx +292 -292
  158. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/LetterformDriftAssembly.tsx +135 -135
  159. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/SplitTextStagger.tsx +124 -124
  160. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/TextOnPath.tsx +255 -255
  161. package/lib/motion/shotcraft/upstream/demos/typography/type-entrance-moves/LetterDropPhysics.tsx +173 -173
  162. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/FontWeightPump.tsx +225 -225
  163. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/KaraokeFillSync.tsx +141 -141
  164. package/lib/motion/shotcraft/upstream/demos/typography/typewriter-moves/TypewriterErrorRetype.tsx +137 -137
  165. package/lib/motion/shotcraft/upstream/demos/typography/vertical-word-roll-blur-cycle/VerticalWordRollBlurCycle.tsx +147 -147
  166. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-filmstrip/WordRelayFilmstrip.tsx +409 -409
  167. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-geometry/WordRelayGeometry.tsx +280 -280
  168. package/lib/motion/shotcraft/upstream/demos/ui-entrance/avatar-bracket-carousel/AvatarBracketCarousel.tsx +271 -271
  169. package/lib/motion/shotcraft/upstream/demos/ui-entrance/bezier-source-converge-merge/BezierSourceConvergeMerge.tsx +385 -385
  170. package/lib/motion/shotcraft/upstream/demos/ui-entrance/card-stack/CardStack.tsx +312 -312
  171. package/lib/motion/shotcraft/upstream/demos/ui-entrance/carousel-3d/Carousel3D.tsx +303 -303
  172. package/lib/motion/shotcraft/upstream/demos/ui-entrance/clipcard-looping/ClipCardLooping.tsx +77 -77
  173. package/lib/motion/shotcraft/upstream/demos/ui-entrance/cloner-depth-echo/ClonerDepthEcho.tsx +311 -311
  174. package/lib/motion/shotcraft/upstream/demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx +307 -307
  175. package/lib/motion/shotcraft/upstream/demos/ui-entrance/doc-park-left-pill-deal/DocParkLeftPillDeal.tsx +349 -349
  176. package/lib/motion/shotcraft/upstream/demos/ui-entrance/document-typewriter-reveal/DocumentTypewriterReveal.tsx +255 -255
  177. package/lib/motion/shotcraft/upstream/demos/ui-entrance/draw-svg-trace/DrawSvgTrace.tsx +244 -244
  178. package/lib/motion/shotcraft/upstream/demos/ui-entrance/element-body-moves/ContactShadowLift.tsx +217 -217
  179. package/lib/motion/shotcraft/upstream/demos/ui-entrance/integration-hub-map/IntegrationHubMap.tsx +652 -652
  180. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-reveal/ListReveal.tsx +153 -153
  181. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-stack-press/ListStackPress.tsx +238 -238
  182. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-forerun/NeonFrameForerun.tsx +324 -324
  183. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +354 -354
  184. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/PageWaterfallWall.tsx +101 -101
  185. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/VerticalTicker.tsx +129 -129
  186. package/lib/motion/shotcraft/upstream/demos/ui-entrance/product-card-progressive-assemble/ProductCardProgressiveAssemble.tsx +297 -297
  187. package/lib/motion/shotcraft/upstream/demos/ui-entrance/radial-wave/RadialWave.tsx +57 -57
  188. package/lib/motion/shotcraft/upstream/demos/ui-entrance/research-card-stack-scroll/ResearchCardStackScroll.tsx +155 -155
  189. package/lib/motion/shotcraft/upstream/demos/ui-entrance/row-embed/RowEmbed.tsx +175 -175
  190. package/lib/motion/shotcraft/upstream/demos/ui-entrance/value-stagger-gradient/ValueStaggerGradient.tsx +153 -153
  191. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/BentoLightUp.tsx +146 -146
  192. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/WireframeDrawOn.tsx +226 -226
  193. package/lib/motion/shotcraft/upstream/gallery/api/library.json +1 -1
  194. package/lib/motion/shotcraft/upstream/references/aesthetic-rules.md +193 -193
  195. package/lib/motion/shotcraft/upstream/references/final-review.md +121 -121
  196. package/lib/motion/shotcraft/upstream/references/guided-free-creation.md +199 -199
  197. package/lib/motion/shotcraft/upstream/references/jianying-export.md +183 -183
  198. package/lib/motion/shotcraft/upstream/references/music-beat-sync.md +257 -257
  199. package/lib/motion/shotcraft/upstream/references/pipeline.md +382 -382
  200. package/lib/motion/shotcraft/upstream/references/publish-upload-post.md +111 -111
  201. package/lib/motion/shotcraft/upstream/references/sequences/promo-energy-arc.md +50 -50
  202. package/lib/motion/shotcraft/upstream/references/sfx-sourcing.md +95 -95
  203. package/lib/motion/shotcraft/upstream/references/shots/camera/basic-3d-scene.md +41 -41
  204. package/lib/motion/shotcraft/upstream/references/shots/camera/crash-zoom-punch.md +52 -52
  205. package/lib/motion/shotcraft/upstream/references/shots/camera/cursor-flyover.md +39 -39
  206. package/lib/motion/shotcraft/upstream/references/shots/camera/depth-layer-moves.md +39 -39
  207. package/lib/motion/shotcraft/upstream/references/shots/camera/graze-face-tour.md +57 -57
  208. package/lib/motion/shotcraft/upstream/references/shots/camera/overhead-camera-moves.md +51 -51
  209. package/lib/motion/shotcraft/upstream/references/shots/camera/space-camera-moves.md +46 -46
  210. package/lib/motion/shotcraft/upstream/references/shots/camera/steep-tilt-glide.md +52 -52
  211. package/lib/motion/shotcraft/upstream/references/shots/camera/tension-camera-moves.md +43 -43
  212. package/lib/motion/shotcraft/upstream/references/shots/camera/terminal-3d.md +42 -42
  213. package/lib/motion/shotcraft/upstream/references/shots/data/before-after-slider-scrub.md +48 -48
  214. package/lib/motion/shotcraft/upstream/references/shots/data/chart-live-moves.md +52 -52
  215. package/lib/motion/shotcraft/upstream/references/shots/data/gauge-readout-moves.md +45 -45
  216. package/lib/motion/shotcraft/upstream/references/shots/data/scroll-brake-moves.md +46 -46
  217. package/lib/motion/shotcraft/upstream/references/shots/data/timeline-travel.md +44 -44
  218. package/lib/motion/shotcraft/upstream/references/shots/effects/assemble-then-type-flyin.md +63 -63
  219. package/lib/motion/shotcraft/upstream/references/shots/effects/aurora-bloom-bg-flip.md +54 -54
  220. package/lib/motion/shotcraft/upstream/references/shots/effects/brand-frame-snap.md +58 -58
  221. package/lib/motion/shotcraft/upstream/references/shots/effects/fui-hud-moves.md +35 -35
  222. package/lib/motion/shotcraft/upstream/references/shots/effects/glow-flyline-moves.md +53 -53
  223. package/lib/motion/shotcraft/upstream/references/shots/effects/icon-performance-moves.md +42 -42
  224. package/lib/motion/shotcraft/upstream/references/shots/effects/impact-feedback.md +50 -50
  225. package/lib/motion/shotcraft/upstream/references/shots/effects/light-play-moves.md +46 -46
  226. package/lib/motion/shotcraft/upstream/references/shots/effects/radial-ripple-phone-chips.md +56 -56
  227. package/lib/motion/shotcraft/upstream/references/shots/effects/riso-print-hits.md +49 -49
  228. package/lib/motion/shotcraft/upstream/references/shots/effects/scan-bracket-sweep.md +50 -50
  229. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-annotate-focus.md +53 -53
  230. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-assemble-flyin.md +53 -53
  231. package/lib/motion/shotcraft/upstream/references/shots/effects/slam-entrance-moves.md +55 -55
  232. package/lib/motion/shotcraft/upstream/references/shots/effects/spotlight-sweep-moves.md +52 -52
  233. package/lib/motion/shotcraft/upstream/references/shots/interaction/autolayout-gap-dial.md +60 -60
  234. package/lib/motion/shotcraft/upstream/references/shots/interaction/canvas-materialize-moves.md +57 -57
  235. package/lib/motion/shotcraft/upstream/references/shots/interaction/chip-grid-single-select-blackout.md +51 -51
  236. package/lib/motion/shotcraft/upstream/references/shots/interaction/collab-cursor-moves.md +41 -41
  237. package/lib/motion/shotcraft/upstream/references/shots/interaction/glass-pill-dictation-typing.md +53 -53
  238. package/lib/motion/shotcraft/upstream/references/shots/interaction/hashtag-to-pill-materialize.md +60 -60
  239. package/lib/motion/shotcraft/upstream/references/shots/interaction/picker-carousel-feature-cycle.md +55 -55
  240. package/lib/motion/shotcraft/upstream/references/shots/interaction/segmented-thumb-hero.md +57 -57
  241. package/lib/motion/shotcraft/upstream/references/shots/interaction/theme-switch-moves.md +47 -47
  242. package/lib/motion/shotcraft/upstream/references/shots/interaction/type-and-filter.md +37 -37
  243. package/lib/motion/shotcraft/upstream/references/shots/interaction/voice-waveform-live.md +54 -54
  244. package/lib/motion/shotcraft/upstream/references/shots/opening/brand-ink-open.md +36 -36
  245. package/lib/motion/shotcraft/upstream/references/shots/opening/crane-rise-reveal.md +56 -56
  246. package/lib/motion/shotcraft/upstream/references/shots/opening/dataviz-landscape-open.md +56 -56
  247. package/lib/motion/shotcraft/upstream/references/shots/opening/fracture.md +40 -40
  248. package/lib/motion/shotcraft/upstream/references/shots/opening/icon-field-colorize.md +60 -60
  249. package/lib/motion/shotcraft/upstream/references/shots/opening/letterspace-materialize.md +57 -57
  250. package/lib/motion/shotcraft/upstream/references/shots/opening/magician-card-flourish.md +73 -73
  251. package/lib/motion/shotcraft/upstream/references/shots/opening/orbit-ring-title-open.md +87 -87
  252. package/lib/motion/shotcraft/upstream/references/shots/opening/spotlight-hero-card.md +55 -55
  253. package/lib/motion/shotcraft/upstream/references/shots/opening/stroke-segment-build.md +50 -50
  254. package/lib/motion/shotcraft/upstream/references/shots/opening/text-as-mask.md +59 -59
  255. package/lib/motion/shotcraft/upstream/references/shots/outro/grain-dissolve.md +38 -38
  256. package/lib/motion/shotcraft/upstream/references/shots/outro/logo-shrink-wordmark-lockup.md +38 -38
  257. package/lib/motion/shotcraft/upstream/references/shots/outro/neon-triple-marquee.md +59 -59
  258. package/lib/motion/shotcraft/upstream/references/shots/outro/outro-group-photo-launch.md +39 -39
  259. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-strip-away-outro.md +61 -61
  260. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-to-brand-morph.md +52 -52
  261. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-cut-moves.md +50 -50
  262. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-step-list-theme-cycle.md +66 -66
  263. package/lib/motion/shotcraft/upstream/references/shots/rhythm/panel-grid-moves.md +43 -43
  264. package/lib/motion/shotcraft/upstream/references/shots/rhythm/quad-split-parallel-scenes.md +38 -38
  265. package/lib/motion/shotcraft/upstream/references/shots/rhythm/rhythm-interrupt-moves.md +38 -38
  266. package/lib/motion/shotcraft/upstream/references/shots/rhythm/sakuga-timing-shift.md +56 -56
  267. package/lib/motion/shotcraft/upstream/references/shots/rhythm/speed-ramp-freeze.md +44 -44
  268. package/lib/motion/shotcraft/upstream/references/shots/rhythm/trailer-grammar-moves.md +38 -38
  269. package/lib/motion/shotcraft/upstream/references/shots/transition/bottom-push-stack-wipe.md +63 -63
  270. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flip-reveal.md +57 -57
  271. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flock-tumble.md +63 -63
  272. package/lib/motion/shotcraft/upstream/references/shots/transition/circle-match-iris.md +58 -58
  273. package/lib/motion/shotcraft/upstream/references/shots/transition/gradient-transition.md +45 -45
  274. package/lib/motion/shotcraft/upstream/references/shots/transition/line-carry-transition.md +55 -55
  275. package/lib/motion/shotcraft/upstream/references/shots/transition/mosaic-reframe.md +49 -49
  276. package/lib/motion/shotcraft/upstream/references/shots/transition/page-turn-transitions.md +42 -42
  277. package/lib/motion/shotcraft/upstream/references/shots/transition/print-texture-transitions.md +42 -42
  278. package/lib/motion/shotcraft/upstream/references/shots/transition/shot-transitions.md +45 -45
  279. package/lib/motion/shotcraft/upstream/references/shots/transition/tear-streak-transitions.md +48 -48
  280. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-hidden-cut.md +55 -55
  281. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-travel.md +43 -43
  282. package/lib/motion/shotcraft/upstream/references/shots/transition/white-flash-logo-simplify-cut.md +41 -41
  283. package/lib/motion/shotcraft/upstream/references/shots/transition/wipe-transitions.md +42 -42
  284. package/lib/motion/shotcraft/upstream/references/shots/typography/blur-slide.md +59 -59
  285. package/lib/motion/shotcraft/upstream/references/shots/typography/brace-expand.md +55 -55
  286. package/lib/motion/shotcraft/upstream/references/shots/typography/countdown-arc-scatter.md +65 -65
  287. package/lib/motion/shotcraft/upstream/references/shots/typography/document-typewriter-reveal.md +42 -42
  288. package/lib/motion/shotcraft/upstream/references/shots/typography/flying-words.md +64 -64
  289. package/lib/motion/shotcraft/upstream/references/shots/typography/glitch-cycle.md +64 -64
  290. package/lib/motion/shotcraft/upstream/references/shots/typography/gradient-word-sweep.md +54 -54
  291. package/lib/motion/shotcraft/upstream/references/shots/typography/lead-word-zoom-assemble.md +91 -91
  292. package/lib/motion/shotcraft/upstream/references/shots/typography/marker-underline-title.md +51 -51
  293. package/lib/motion/shotcraft/upstream/references/shots/typography/outline-word-fill.md +66 -66
  294. package/lib/motion/shotcraft/upstream/references/shots/typography/paper-title-card.md +38 -38
  295. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-chip-slot-cycle-handled.md +66 -66
  296. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-slot-cycle.md +58 -58
  297. package/lib/motion/shotcraft/upstream/references/shots/typography/text-column-converge.md +61 -61
  298. package/lib/motion/shotcraft/upstream/references/shots/typography/title-demote-to-label.md +64 -64
  299. package/lib/motion/shotcraft/upstream/references/shots/typography/type-assembly-moves.md +45 -45
  300. package/lib/motion/shotcraft/upstream/references/shots/typography/type-entrance-moves.md +41 -41
  301. package/lib/motion/shotcraft/upstream/references/shots/typography/type-rhythm-sync.md +51 -51
  302. package/lib/motion/shotcraft/upstream/references/shots/typography/typewriter-moves.md +42 -42
  303. package/lib/motion/shotcraft/upstream/references/shots/typography/vertical-word-roll-blur-cycle.md +63 -63
  304. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-filmstrip.md +57 -57
  305. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-geometry.md +75 -75
  306. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/avatar-bracket-carousel.md +59 -59
  307. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/bezier-source-converge-merge.md +67 -67
  308. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/card-stack.md +60 -60
  309. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/carousel-3d.md +66 -66
  310. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/cloner-depth-echo.md +40 -40
  311. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/deck-deal-flyin.md +45 -45
  312. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/doc-park-left-pill-deal.md +62 -62
  313. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/draw-svg-trace.md +55 -55
  314. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/element-body-moves.md +37 -37
  315. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/integration-hub-map.md +55 -55
  316. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-reveal.md +50 -50
  317. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-stack-press.md +43 -43
  318. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-forerun.md +55 -55
  319. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-orbit-drop.md +51 -51
  320. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/page-waterfall-wall.md +51 -51
  321. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/product-card-progressive-assemble.md +56 -56
  322. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/radial-wave.md +49 -49
  323. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/research-card-stack-scroll.md +57 -57
  324. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/row-embed.md +36 -36
  325. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/value-stagger-gradient.md +64 -64
  326. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/wall-reveal-moves.md +47 -47
  327. package/lib/motion/shotcraft/upstream/references/sound-design.md +170 -170
  328. package/lib/motion/shotcraft/upstream/references/workbench.md +157 -157
  329. package/lib/motion/shotcraft/upstream/template/TEMPLATE.md +103 -103
  330. package/lib/motion/shotcraft/upstream/template/THEMES.md +44 -44
  331. package/lib/motion/shotcraft/upstream/template/package.json +20 -20
  332. package/lib/motion/shotcraft/upstream/template/remotion.config.ts +6 -6
  333. package/lib/motion/shotcraft/upstream/template/src/Root.tsx +17 -17
  334. package/lib/motion/shotcraft/upstream/template/src/aifl/Caption.tsx +65 -65
  335. package/lib/motion/shotcraft/upstream/template/src/aifl/DigitRoll.tsx +48 -48
  336. package/lib/motion/shotcraft/upstream/template/src/aifl/FlashCut.tsx +24 -24
  337. package/lib/motion/shotcraft/upstream/template/src/aifl/Main.tsx +192 -192
  338. package/lib/motion/shotcraft/upstream/template/src/aifl/PaperTitleCard.tsx +111 -111
  339. package/lib/motion/shotcraft/upstream/template/src/aifl/live/PageCam.tsx +150 -150
  340. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneDetail.tsx +158 -158
  341. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneFlyIn.tsx +468 -468
  342. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOpen.tsx +552 -552
  343. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOutroLive.tsx +411 -411
  344. package/lib/motion/shotcraft/upstream/template/src/aifl/live/ScenePapers.tsx +200 -200
  345. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneWbr.tsx +324 -324
  346. package/lib/motion/shotcraft/upstream/template/src/aifl/live-layout.json +388 -388
  347. package/lib/motion/shotcraft/upstream/template/src/index.ts +4 -4
  348. package/lib/motion/shotcraft/upstream/template/src/themes/ThemedFilm.tsx +7 -7
  349. package/lib/motion/shotcraft/upstream/template/src/themes/manifest.tsx +68 -68
  350. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.json +1 -1
  351. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.ts +24 -24
  352. package/lib/motion/shotcraft/upstream/template/src/themes/palettes.json +74 -74
  353. package/lib/motion/shotcraft/upstream/template/src/themes/visual-theme.tsx +91 -91
  354. package/lib/motion/shotcraft/upstream/template/src/workbench.ts +213 -213
  355. package/lib/motion/shotcraft/upstream/template/tsconfig.json +15 -15
  356. package/lib/motion/style-frames.js +306 -306
  357. package/lib/motion/sync.js +214 -214
  358. package/lib/motion-project.js +105 -105
  359. package/lib/motion-render-worker.js +174 -174
  360. package/lib/routing/router.js +222 -222
  361. package/lib/routing/vendor/README.md +96 -96
  362. package/lib/routing/vendor/libavoid-routing.js +753 -753
  363. package/lib/routing/vendor/libavoid.min.js +59 -59
  364. package/lib/video-trace-pool.js +128 -128
  365. package/package.json +1 -1
  366. package/LICENSE +0 -4175
@@ -1,279 +1,279 @@
1
- // 子弹时间冻结环绕(bullet-time-freeze-orbit)——The Matrix bullet time:时间停住,相机却在动。
2
- //
3
- // 第二轮重设计(midnight · 深蓝夜 + 电光蓝):
4
- // - 主体是一块悬在暗场里的玻璃数据面板(1180×640):7 根柱子按周错峰生长,每根柱顶向上喷出一串
5
- // "数据火花"(确定性粒子 ×140,带真实 z 深度 -300…+600px),右上角 120px 的六位滚轮计数器跟着冲。
6
- // - 双时钟(命门):内容全部吃 eff(内容时钟),相机吃真实帧。eff 不是硬停,而是 8f 的速度坡道
7
- // "急刹"进冻结(40–48f)、冻结 52 帧、再 8f 坡道恢复(100–108f)——像升格摄影的变速。
8
- // 冻结期:柱子停在半途的波浪形、火花悬在半空并保留拖尾(拖尾长度按内容时钟的速度算,所以冻住的是
9
- // "运动中的瞬间"而不是静止画面)、计数器低位的滚动模糊也一起冻住。
10
- // - 环绕:真实 3D 场景(preserve-3d)——面板、火花、透视网格地面、远处点阵墙各在自己的深度。
11
- // 相机 rotateY 0→-52°(26f,smooth)→ 顶点慢漂 12f → 回 0(22f,swift),同时 rotateX 抬 6°、
12
- // 推近 160px。火花与面板、地面与背墙之间的视差把"相机在绕"讲清楚。
13
- // - 恢复:柱子长完、火花散尽、柱顶数值标签逐个弹出,主角柱(周日)电光蓝 + 泛光,其余石板蓝。
14
- //
15
- // 时间表(30fps,共 170f):
16
- // 0–40 正常时间:柱子错峰生长(每根晚 5f)、火花上喷、计数器冲刺
17
- // 40–48 速度坡道刹停(eff 速度 1→0)
18
- // 48–100 冻结:相机 46–72 绕到 -52°,72–84 顶点慢漂,84–106 回正(推近 / 抬升同步)
19
- // 100–108 速度坡道恢复
20
- // 108–140 余波:柱子长完、火花散尽、数值标签弹出(eff 驱动)
21
- // 140–170 hold:光的极缓呼吸,海报落定
22
- import React from 'react';
23
- import { AbsoluteFill, useCurrentFrame } from 'remotion';
24
- import { EASE, FONT, mix, ramp } from '../../_fixtures/Polish';
25
- import { LOOKS, Stage, alpha, springAt, type } from '../../_fixtures/Look';
26
- import { ShotcraftMark } from '../../_fixtures/Brand';
27
-
28
- export const BULLET_TIME_FREEZE_ORBIT_DURATION = 170;
29
-
30
- const L = LOOKS.midnight;
31
- const PANEL = { w: 1180, h: 640 };
32
- const CH = { x: 90, y: 250, w: 1000, h: 300 }; // 图表区(面板内坐标)
33
- const BARS = [0.46, 0.58, 0.52, 0.7, 0.64, 0.82, 1.0];
34
- const DAYS = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
35
- const BAR_W = 96;
36
- const BAR_GAP = (CH.w - BARS.length * BAR_W) / (BARS.length - 1);
37
- const GROW = 40; // 每根柱子的生长时长(内容时钟)
38
- const startOf = (i: number) => 2 + i * 5; // 冻结时(eff≈40)柱顶正好是一道由高到低的波浪
39
- const TOTAL = 184920;
40
-
41
- const hash = (n: number) => {
42
- const x = Math.sin(n * 127.1 + 311.7) * 43758.5453;
43
- return x - Math.floor(x);
44
- };
45
-
46
- // —— 内容时钟:速度坡道进出冻结 ——
47
- const speedAt = (f: number) =>
48
- f < 40 ? 1 : f < 48 ? 1 - EASE.smooth((f - 40) / 8) : f < 100 ? 0 : f < 108 ? EASE.smooth((f - 100) / 8) : 1;
49
- const EFF: number[] = (() => {
50
- const out = [0];
51
- let e = 0;
52
- for (let f = 0; f < 200; f++) {
53
- for (let s = 0; s < 4; s++) e += speedAt(f + (s + 0.5) / 4) / 4;
54
- out.push(e);
55
- }
56
- return out;
57
- })();
58
- const effAt = (f: number) => {
59
- const i = Math.max(0, Math.min(EFF.length - 2, Math.floor(f)));
60
- return mix(EFF[i], EFF[i + 1], f - i);
61
- };
62
-
63
- const growth = (i: number, e: number) => ramp(e, startOf(i), GROW, EASE.swift);
64
- const barTop = (i: number, e: number) => CH.y + CH.h - CH.h * BARS[i] * growth(i, e); // 面板内 y
65
- const barCx = (i: number) => CH.x + i * (BAR_W + BAR_GAP) + BAR_W / 2;
66
-
67
- // —— 火花:每根柱 12 颗,出生于柱顶(出生时刻的柱顶),向上减速飞散,带 z 深度 ——
68
- const SPARKS = BARS.flatMap((_, i) =>
69
- Array.from({ length: 20 }, (_, k) => {
70
- const r = (n: number) => hash(i * 97.1 + k * 13.7 + n);
71
- return {
72
- bar: i, born: startOf(i) + 1 + k * 1.9 + r(1) * 2,
73
- dx: (r(2) - 0.5) * BAR_W * 1.1, vx: (r(3) - 0.5) * 5,
74
- v0: 12 + r(4) * 14, tau: 8 + r(5) * 9, z: (r(6) - 0.35) * 900,
75
- size: 4 + r(7) * 7, life: 30 + r(8) * 22, hot: r(9) < 0.35,
76
- };
77
- }),
78
- );
79
-
80
- // —— 滚轮计数器:每位一条数字带,按内容时钟的转速竖向模糊 ——
81
- const valueAt = (e: number) => TOTAL * ramp(e, 4, 68, EASE.out);
82
- const digitPos = (v: number, k: number) => {
83
- const p10 = Math.pow(10, k);
84
- if (k === 0) return v % 10;
85
- const d = Math.floor(v / p10) % 10;
86
- const lower = v % p10;
87
- return d + Math.min(1, Math.max(0, lower - (p10 - 1)));
88
- };
89
- const STRIP = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'];
90
-
91
- const Odometer: React.FC<{ e: number }> = ({ e }) => {
92
- const v = valueAt(e);
93
- const v2 = valueAt(e + 0.5);
94
- const v1 = valueAt(e - 0.5);
95
- const cols = 6;
96
- return (
97
- <div style={{ display: 'flex', ...type(112, 700), letterSpacing: 0, color: L.ink, lineHeight: 1 }}>
98
- {Array.from({ length: cols }, (_, ci) => {
99
- const k = cols - 1 - ci;
100
- const pos = digitPos(v, k);
101
- const speed = Math.abs(digitPos(v2, k) - digitPos(v1, k));
102
- const sp = speed > 5 ? 10 - speed : speed; // 跨 9→0 回绕时修正
103
- const blur = Math.min(9, sp * 112 * 0.1);
104
- const lit = v >= Math.pow(10, k) || k === 0;
105
- return (
106
- <React.Fragment key={ci}>
107
- {ci === 3 && <span style={{ width: '0.28em', textAlign: 'center', color: lit ? L.ink2 : L.ink3 }}>,</span>}
108
- <div style={{
109
- position: 'relative', width: '0.62em', height: '1.24em', margin: '-0.12em 0', overflow: 'hidden',
110
- // 滚轮窗口上下渐隐:冻住的模糊数字带不留硬边
111
- WebkitMaskImage: 'linear-gradient(180deg, transparent 0%, #000 16%, #000 84%, transparent 100%)',
112
- maskImage: 'linear-gradient(180deg, transparent 0%, #000 16%, #000 84%, transparent 100%)',
113
- }}>
114
- <div style={{
115
- position: 'absolute', left: 0, top: '0.12em', width: '100%', transform: `translateY(${(-pos).toFixed(4)}em)`,
116
- filter: blur > 0.3 ? `blur(${(blur * 0.35).toFixed(2)}px)` : undefined,
117
- color: lit ? L.ink : L.ink3,
118
- }}>
119
- {STRIP.map((c, i) => (
120
- <div key={i} style={{ height: '1em', textAlign: 'center', opacity: blur > 0.3 ? 1 - Math.min(0.45, blur / 30) : 1 }}>{c}</div>
121
- ))}
122
- </div>
123
- </div>
124
- </React.Fragment>
125
- );
126
- })}
127
- </div>
128
- );
129
- };
130
-
131
- export const BulletTimeFreezeOrbit: React.FC = () => {
132
- const frame = useCurrentFrame();
133
- const e = effAt(frame);
134
- const frozen = 1 - speedAt(frame);
135
-
136
- // —— 相机(真实时钟)——
137
- const out = ramp(frame, 46, 26, EASE.smooth);
138
- const back = ramp(frame, 84, 22, EASE.swift);
139
- const drift = ramp(frame, 72, 12, EASE.linear);
140
- const orbit = out * (1 - back); // 0→1→0
141
- const ry = -52 * out * (1 - back) - 3 * drift * (1 - back);
142
- const rx = -3 - 6 * orbit;
143
- const dolly = 160 * orbit;
144
- const breathe = 1 + 0.05 * Math.sin(frame / 26);
145
-
146
- // 冻结时的空气:冷光微微加亮、四周收拢
147
- const chill = ramp(frame, 40, 10, EASE.out) * (1 - ramp(frame, 98, 12, EASE.smooth));
148
-
149
- return (
150
- <AbsoluteFill style={{ overflow: 'hidden', fontFamily: FONT.sans }}>
151
- <Stage look={L} keyLight={{ x: 0.5, y: 0.04 }} fill={{ x: 0.5, y: 1.0 }} breathe={0.5} intensity={1 + 0.25 * chill} />
152
-
153
- <AbsoluteFill style={{ perspective: 1800, perspectiveOrigin: '50% 46%' }}>
154
- <div style={{
155
- position: 'absolute', left: 960, top: 520, width: 0, height: 0, transformStyle: 'preserve-3d',
156
- transform: `translateZ(${dolly.toFixed(2)}px) rotateX(${rx.toFixed(3)}deg) rotateY(${ry.toFixed(3)}deg)`,
157
- }}>
158
- {/* 远处点阵墙 */}
159
- <div style={{
160
- position: 'absolute', left: -2600, top: -1500, width: 5200, height: 3000,
161
- transform: 'translateZ(-1200px)',
162
- backgroundImage: `radial-gradient(circle at 3px 3px, ${alpha(L.accent, 0.35)} 2px, transparent 3px)`,
163
- backgroundSize: '64px 64px',
164
- WebkitMaskImage: 'radial-gradient(ellipse 40% 42% at 50% 50%, #000 0%, transparent 100%)',
165
- maskImage: 'radial-gradient(ellipse 40% 42% at 50% 50%, #000 0%, transparent 100%)',
166
- opacity: 0.55,
167
- }} />
168
- {/* 透视网格地面(面板下沿下方 70px) */}
169
- <div style={{
170
- position: 'absolute', left: -1800, top: PANEL.h / 2 + 70 - 1800, width: 3600, height: 3600,
171
- transform: 'rotateX(90deg)',
172
- backgroundImage:
173
- `radial-gradient(ellipse 22% 14% at 50% 50%, ${alpha(L.accent, 0.32)} 0%, transparent 100%),` +
174
- `linear-gradient(${alpha(L.accent, 0.22)} 2px, transparent 2px), linear-gradient(90deg, ${alpha(L.accent, 0.22)} 2px, transparent 2px)`,
175
- backgroundSize: '100% 100%, 120px 120px, 120px 120px',
176
- backgroundPosition: '0 0, -1px -1px, -1px -1px',
177
- WebkitMaskImage: 'radial-gradient(circle at 50% 50%, #000 0%, transparent 46%)',
178
- maskImage: 'radial-gradient(circle at 50% 50%, #000 0%, transparent 46%)',
179
- }} />
180
-
181
- {/* 面板 */}
182
- <div style={{
183
- position: 'absolute', left: -PANEL.w / 2, top: -PANEL.h / 2, width: PANEL.w, height: PANEL.h, boxSizing: 'border-box',
184
- borderRadius: 32, overflow: 'hidden',
185
- background: `linear-gradient(180deg, ${alpha('#1a2440', 0.94)} 0%, ${alpha(L.surface, 0.96)} 100%)`,
186
- border: `1.5px solid ${alpha('#a0beff', 0.18)}`,
187
- boxShadow: `inset 0 1.5px 0 ${alpha('#ffffff', 0.12)}, 0 50px 120px -30px ${alpha('#000208', 0.9)}`,
188
- }}>
189
- {/* 头部:video-shotcraft 渲染面板(标志 + 眉题 + 指标名) */}
190
- <div style={{ position: 'absolute', left: 64, top: 52 }}>
191
- <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
192
- <ShotcraftMark size={40} tone="dark" style={{ margin: '-6px -2px -6px -5px' }} />
193
- <div style={{ ...type(26, 650, { caps: true }), letterSpacing: '0.2em', color: L.accent }}>Render farm · promo</div>
194
- </div>
195
- <div style={{ ...type(52, 700), color: L.ink, marginTop: 14 }}>Frames rendered</div>
196
- </div>
197
- <div style={{ position: 'absolute', right: 64, top: 46 }}><Odometer e={e} /></div>
198
-
199
- {/* 刻度线 */}
200
- {[0, 1, 2, 3].map((g) => (
201
- <div key={g} style={{ position: 'absolute', left: CH.x, width: CH.w, top: CH.y + (CH.h / 3) * g, height: 1, background: g === 3 ? alpha(L.ink, 0.25) : L.line }} />
202
- ))}
203
- {/* 柱子 */}
204
- {BARS.map((b, i) => {
205
- const top = barTop(i, e);
206
- const hgt = CH.y + CH.h - top;
207
- const hero = i === BARS.length - 1;
208
- const lk = springAt(e, startOf(i) + GROW - 2, { damping: 15, stiffness: 200 });
209
- return (
210
- <React.Fragment key={i}>
211
- <div style={{
212
- position: 'absolute', left: barCx(i) - BAR_W / 2, top, width: BAR_W, height: hgt, borderRadius: '14px 14px 4px 4px',
213
- background: hero
214
- ? `linear-gradient(180deg, #8fb0ff 0%, ${L.accent} 30%, #2f55d8 100%)`
215
- : `linear-gradient(180deg, #3a4b74 0%, #253252 100%)`,
216
- boxShadow: hero
217
- ? `inset 0 2px 0 rgba(255,255,255,0.5), 0 0 40px ${alpha(L.accent, 0.55)}`
218
- : `inset 0 2px 0 rgba(255,255,255,0.18)`,
219
- }} />
220
- {/* 柱顶亮边(生长中的"刀口") */}
221
- {growth(i, e) < 1 && growth(i, e) > 0 && (
222
- <div style={{ position: 'absolute', left: barCx(i) - BAR_W / 2 - 6, top: top - 3, width: BAR_W + 12, height: 6, borderRadius: 3, background: '#dfe8ff', boxShadow: `0 0 18px ${alpha(L.accent, 0.9)}` }} />
223
- )}
224
- <div style={{
225
- position: 'absolute', left: barCx(i) - 80, width: 160, top: CH.y + CH.h - CH.h * b - 54, textAlign: 'center',
226
- ...type(36, 700), color: hero ? '#bcd0ff' : L.ink2, opacity: Math.min(1, lk * 1.4),
227
- transform: `translateY(${((1 - lk) * 14).toFixed(2)}px) scale(${(0.8 + 0.2 * lk).toFixed(3)})`,
228
- }}>
229
- {Math.round(b * 31.4)}k
230
- </div>
231
- <div style={{ position: 'absolute', left: barCx(i) - 80, width: 160, top: CH.y + CH.h + 18, textAlign: 'center', ...type(26, 550), color: hero ? L.ink : L.ink3 }}>
232
- {DAYS[i]}
233
- </div>
234
- </React.Fragment>
235
- );
236
- })}
237
- {/* 冻结时面板表面的冷光(裁进圆角,跟相机角度横移) */}
238
- <div style={{
239
- position: 'absolute', inset: 0, pointerEvents: 'none', opacity: 0.5 * orbit,
240
- background: `linear-gradient(105deg, transparent ${(30 + 50 * orbit).toFixed(1)}%, ${alpha('#cfdcff', 0.16)} ${(45 + 50 * orbit).toFixed(1)}%, transparent ${(60 + 50 * orbit).toFixed(1)}%)`,
241
- }} />
242
- </div>
243
-
244
- {/* 火花(真实 z 深度,冻结时悬停并保留拖尾) */}
245
- {SPARKS.map((s, idx) => {
246
- const age = e - s.born;
247
- if (age < 0 || age > s.life) return null;
248
- const birthTop = barTop(s.bar, s.born);
249
- const k = 1 - Math.exp(-age / s.tau);
250
- const x = barCx(s.bar) + s.dx + s.vx * age - PANEL.w / 2;
251
- const y = birthTop - s.v0 * s.tau * k - PANEL.h / 2;
252
- const z = s.z * k;
253
- const v = s.v0 * Math.exp(-age / s.tau); // 内容时钟下的速度
254
- const len = s.size + v * 3.2;
255
- const fade = Math.min(1, age / 3) * (1 - Math.pow(age / s.life, 2));
256
- const c = s.hot ? '#ffffff' : '#9cb8ff';
257
- return (
258
- <div key={idx} style={{
259
- position: 'absolute', left: x - s.size / 2, top: y, width: s.size, height: len, borderRadius: s.size,
260
- transform: `translateZ(${z.toFixed(1)}px)`,
261
- background: `linear-gradient(180deg, ${c} 0%, ${alpha(c, 0)} 100%)`,
262
- boxShadow: `0 0 ${(s.size * 2).toFixed(1)}px ${alpha(L.accent, 0.8)}`,
263
- opacity: fade * (0.85 + 0.15 * breathe),
264
- }} />
265
- );
266
- })}
267
- </div>
268
- </AbsoluteFill>
269
-
270
- {/* 冻结期暗角收拢(屏幕空间) */}
271
- {frozen > 0.001 || chill > 0.001 ? (
272
- <AbsoluteFill style={{
273
- pointerEvents: 'none', opacity: chill,
274
- background: `radial-gradient(ellipse 64% 64% at 50% 48%, ${alpha('#050a1c', 0)} 50%, ${alpha('#050a1c', 0.55)} 100%)`,
275
- }} />
276
- ) : null}
277
- </AbsoluteFill>
278
- );
279
- };
1
+ // 子弹时间冻结环绕(bullet-time-freeze-orbit)——The Matrix bullet time:时间停住,相机却在动。
2
+ //
3
+ // 第二轮重设计(midnight · 深蓝夜 + 电光蓝):
4
+ // - 主体是一块悬在暗场里的玻璃数据面板(1180×640):7 根柱子按周错峰生长,每根柱顶向上喷出一串
5
+ // "数据火花"(确定性粒子 ×140,带真实 z 深度 -300…+600px),右上角 120px 的六位滚轮计数器跟着冲。
6
+ // - 双时钟(命门):内容全部吃 eff(内容时钟),相机吃真实帧。eff 不是硬停,而是 8f 的速度坡道
7
+ // "急刹"进冻结(40–48f)、冻结 52 帧、再 8f 坡道恢复(100–108f)——像升格摄影的变速。
8
+ // 冻结期:柱子停在半途的波浪形、火花悬在半空并保留拖尾(拖尾长度按内容时钟的速度算,所以冻住的是
9
+ // "运动中的瞬间"而不是静止画面)、计数器低位的滚动模糊也一起冻住。
10
+ // - 环绕:真实 3D 场景(preserve-3d)——面板、火花、透视网格地面、远处点阵墙各在自己的深度。
11
+ // 相机 rotateY 0→-52°(26f,smooth)→ 顶点慢漂 12f → 回 0(22f,swift),同时 rotateX 抬 6°、
12
+ // 推近 160px。火花与面板、地面与背墙之间的视差把"相机在绕"讲清楚。
13
+ // - 恢复:柱子长完、火花散尽、柱顶数值标签逐个弹出,主角柱(周日)电光蓝 + 泛光,其余石板蓝。
14
+ //
15
+ // 时间表(30fps,共 170f):
16
+ // 0–40 正常时间:柱子错峰生长(每根晚 5f)、火花上喷、计数器冲刺
17
+ // 40–48 速度坡道刹停(eff 速度 1→0)
18
+ // 48–100 冻结:相机 46–72 绕到 -52°,72–84 顶点慢漂,84–106 回正(推近 / 抬升同步)
19
+ // 100–108 速度坡道恢复
20
+ // 108–140 余波:柱子长完、火花散尽、数值标签弹出(eff 驱动)
21
+ // 140–170 hold:光的极缓呼吸,海报落定
22
+ import React from 'react';
23
+ import { AbsoluteFill, useCurrentFrame } from 'remotion';
24
+ import { EASE, FONT, mix, ramp } from '../../_fixtures/Polish';
25
+ import { LOOKS, Stage, alpha, springAt, type } from '../../_fixtures/Look';
26
+ import { ShotcraftMark } from '../../_fixtures/Brand';
27
+
28
+ export const BULLET_TIME_FREEZE_ORBIT_DURATION = 170;
29
+
30
+ const L = LOOKS.midnight;
31
+ const PANEL = { w: 1180, h: 640 };
32
+ const CH = { x: 90, y: 250, w: 1000, h: 300 }; // 图表区(面板内坐标)
33
+ const BARS = [0.46, 0.58, 0.52, 0.7, 0.64, 0.82, 1.0];
34
+ const DAYS = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
35
+ const BAR_W = 96;
36
+ const BAR_GAP = (CH.w - BARS.length * BAR_W) / (BARS.length - 1);
37
+ const GROW = 40; // 每根柱子的生长时长(内容时钟)
38
+ const startOf = (i: number) => 2 + i * 5; // 冻结时(eff≈40)柱顶正好是一道由高到低的波浪
39
+ const TOTAL = 184920;
40
+
41
+ const hash = (n: number) => {
42
+ const x = Math.sin(n * 127.1 + 311.7) * 43758.5453;
43
+ return x - Math.floor(x);
44
+ };
45
+
46
+ // —— 内容时钟:速度坡道进出冻结 ——
47
+ const speedAt = (f: number) =>
48
+ f < 40 ? 1 : f < 48 ? 1 - EASE.smooth((f - 40) / 8) : f < 100 ? 0 : f < 108 ? EASE.smooth((f - 100) / 8) : 1;
49
+ const EFF: number[] = (() => {
50
+ const out = [0];
51
+ let e = 0;
52
+ for (let f = 0; f < 200; f++) {
53
+ for (let s = 0; s < 4; s++) e += speedAt(f + (s + 0.5) / 4) / 4;
54
+ out.push(e);
55
+ }
56
+ return out;
57
+ })();
58
+ const effAt = (f: number) => {
59
+ const i = Math.max(0, Math.min(EFF.length - 2, Math.floor(f)));
60
+ return mix(EFF[i], EFF[i + 1], f - i);
61
+ };
62
+
63
+ const growth = (i: number, e: number) => ramp(e, startOf(i), GROW, EASE.swift);
64
+ const barTop = (i: number, e: number) => CH.y + CH.h - CH.h * BARS[i] * growth(i, e); // 面板内 y
65
+ const barCx = (i: number) => CH.x + i * (BAR_W + BAR_GAP) + BAR_W / 2;
66
+
67
+ // —— 火花:每根柱 12 颗,出生于柱顶(出生时刻的柱顶),向上减速飞散,带 z 深度 ——
68
+ const SPARKS = BARS.flatMap((_, i) =>
69
+ Array.from({ length: 20 }, (_, k) => {
70
+ const r = (n: number) => hash(i * 97.1 + k * 13.7 + n);
71
+ return {
72
+ bar: i, born: startOf(i) + 1 + k * 1.9 + r(1) * 2,
73
+ dx: (r(2) - 0.5) * BAR_W * 1.1, vx: (r(3) - 0.5) * 5,
74
+ v0: 12 + r(4) * 14, tau: 8 + r(5) * 9, z: (r(6) - 0.35) * 900,
75
+ size: 4 + r(7) * 7, life: 30 + r(8) * 22, hot: r(9) < 0.35,
76
+ };
77
+ }),
78
+ );
79
+
80
+ // —— 滚轮计数器:每位一条数字带,按内容时钟的转速竖向模糊 ——
81
+ const valueAt = (e: number) => TOTAL * ramp(e, 4, 68, EASE.out);
82
+ const digitPos = (v: number, k: number) => {
83
+ const p10 = Math.pow(10, k);
84
+ if (k === 0) return v % 10;
85
+ const d = Math.floor(v / p10) % 10;
86
+ const lower = v % p10;
87
+ return d + Math.min(1, Math.max(0, lower - (p10 - 1)));
88
+ };
89
+ const STRIP = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'];
90
+
91
+ const Odometer: React.FC<{ e: number }> = ({ e }) => {
92
+ const v = valueAt(e);
93
+ const v2 = valueAt(e + 0.5);
94
+ const v1 = valueAt(e - 0.5);
95
+ const cols = 6;
96
+ return (
97
+ <div style={{ display: 'flex', ...type(112, 700), letterSpacing: 0, color: L.ink, lineHeight: 1 }}>
98
+ {Array.from({ length: cols }, (_, ci) => {
99
+ const k = cols - 1 - ci;
100
+ const pos = digitPos(v, k);
101
+ const speed = Math.abs(digitPos(v2, k) - digitPos(v1, k));
102
+ const sp = speed > 5 ? 10 - speed : speed; // 跨 9→0 回绕时修正
103
+ const blur = Math.min(9, sp * 112 * 0.1);
104
+ const lit = v >= Math.pow(10, k) || k === 0;
105
+ return (
106
+ <React.Fragment key={ci}>
107
+ {ci === 3 && <span style={{ width: '0.28em', textAlign: 'center', color: lit ? L.ink2 : L.ink3 }}>,</span>}
108
+ <div style={{
109
+ position: 'relative', width: '0.62em', height: '1.24em', margin: '-0.12em 0', overflow: 'hidden',
110
+ // 滚轮窗口上下渐隐:冻住的模糊数字带不留硬边
111
+ WebkitMaskImage: 'linear-gradient(180deg, transparent 0%, #000 16%, #000 84%, transparent 100%)',
112
+ maskImage: 'linear-gradient(180deg, transparent 0%, #000 16%, #000 84%, transparent 100%)',
113
+ }}>
114
+ <div style={{
115
+ position: 'absolute', left: 0, top: '0.12em', width: '100%', transform: `translateY(${(-pos).toFixed(4)}em)`,
116
+ filter: blur > 0.3 ? `blur(${(blur * 0.35).toFixed(2)}px)` : undefined,
117
+ color: lit ? L.ink : L.ink3,
118
+ }}>
119
+ {STRIP.map((c, i) => (
120
+ <div key={i} style={{ height: '1em', textAlign: 'center', opacity: blur > 0.3 ? 1 - Math.min(0.45, blur / 30) : 1 }}>{c}</div>
121
+ ))}
122
+ </div>
123
+ </div>
124
+ </React.Fragment>
125
+ );
126
+ })}
127
+ </div>
128
+ );
129
+ };
130
+
131
+ export const BulletTimeFreezeOrbit: React.FC = () => {
132
+ const frame = useCurrentFrame();
133
+ const e = effAt(frame);
134
+ const frozen = 1 - speedAt(frame);
135
+
136
+ // —— 相机(真实时钟)——
137
+ const out = ramp(frame, 46, 26, EASE.smooth);
138
+ const back = ramp(frame, 84, 22, EASE.swift);
139
+ const drift = ramp(frame, 72, 12, EASE.linear);
140
+ const orbit = out * (1 - back); // 0→1→0
141
+ const ry = -52 * out * (1 - back) - 3 * drift * (1 - back);
142
+ const rx = -3 - 6 * orbit;
143
+ const dolly = 160 * orbit;
144
+ const breathe = 1 + 0.05 * Math.sin(frame / 26);
145
+
146
+ // 冻结时的空气:冷光微微加亮、四周收拢
147
+ const chill = ramp(frame, 40, 10, EASE.out) * (1 - ramp(frame, 98, 12, EASE.smooth));
148
+
149
+ return (
150
+ <AbsoluteFill style={{ overflow: 'hidden', fontFamily: FONT.sans }}>
151
+ <Stage look={L} keyLight={{ x: 0.5, y: 0.04 }} fill={{ x: 0.5, y: 1.0 }} breathe={0.5} intensity={1 + 0.25 * chill} />
152
+
153
+ <AbsoluteFill style={{ perspective: 1800, perspectiveOrigin: '50% 46%' }}>
154
+ <div style={{
155
+ position: 'absolute', left: 960, top: 520, width: 0, height: 0, transformStyle: 'preserve-3d',
156
+ transform: `translateZ(${dolly.toFixed(2)}px) rotateX(${rx.toFixed(3)}deg) rotateY(${ry.toFixed(3)}deg)`,
157
+ }}>
158
+ {/* 远处点阵墙 */}
159
+ <div style={{
160
+ position: 'absolute', left: -2600, top: -1500, width: 5200, height: 3000,
161
+ transform: 'translateZ(-1200px)',
162
+ backgroundImage: `radial-gradient(circle at 3px 3px, ${alpha(L.accent, 0.35)} 2px, transparent 3px)`,
163
+ backgroundSize: '64px 64px',
164
+ WebkitMaskImage: 'radial-gradient(ellipse 40% 42% at 50% 50%, #000 0%, transparent 100%)',
165
+ maskImage: 'radial-gradient(ellipse 40% 42% at 50% 50%, #000 0%, transparent 100%)',
166
+ opacity: 0.55,
167
+ }} />
168
+ {/* 透视网格地面(面板下沿下方 70px) */}
169
+ <div style={{
170
+ position: 'absolute', left: -1800, top: PANEL.h / 2 + 70 - 1800, width: 3600, height: 3600,
171
+ transform: 'rotateX(90deg)',
172
+ backgroundImage:
173
+ `radial-gradient(ellipse 22% 14% at 50% 50%, ${alpha(L.accent, 0.32)} 0%, transparent 100%),` +
174
+ `linear-gradient(${alpha(L.accent, 0.22)} 2px, transparent 2px), linear-gradient(90deg, ${alpha(L.accent, 0.22)} 2px, transparent 2px)`,
175
+ backgroundSize: '100% 100%, 120px 120px, 120px 120px',
176
+ backgroundPosition: '0 0, -1px -1px, -1px -1px',
177
+ WebkitMaskImage: 'radial-gradient(circle at 50% 50%, #000 0%, transparent 46%)',
178
+ maskImage: 'radial-gradient(circle at 50% 50%, #000 0%, transparent 46%)',
179
+ }} />
180
+
181
+ {/* 面板 */}
182
+ <div style={{
183
+ position: 'absolute', left: -PANEL.w / 2, top: -PANEL.h / 2, width: PANEL.w, height: PANEL.h, boxSizing: 'border-box',
184
+ borderRadius: 32, overflow: 'hidden',
185
+ background: `linear-gradient(180deg, ${alpha('#1a2440', 0.94)} 0%, ${alpha(L.surface, 0.96)} 100%)`,
186
+ border: `1.5px solid ${alpha('#a0beff', 0.18)}`,
187
+ boxShadow: `inset 0 1.5px 0 ${alpha('#ffffff', 0.12)}, 0 50px 120px -30px ${alpha('#000208', 0.9)}`,
188
+ }}>
189
+ {/* 头部:video-shotcraft 渲染面板(标志 + 眉题 + 指标名) */}
190
+ <div style={{ position: 'absolute', left: 64, top: 52 }}>
191
+ <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
192
+ <ShotcraftMark size={40} tone="dark" style={{ margin: '-6px -2px -6px -5px' }} />
193
+ <div style={{ ...type(26, 650, { caps: true }), letterSpacing: '0.2em', color: L.accent }}>Render farm · promo</div>
194
+ </div>
195
+ <div style={{ ...type(52, 700), color: L.ink, marginTop: 14 }}>Frames rendered</div>
196
+ </div>
197
+ <div style={{ position: 'absolute', right: 64, top: 46 }}><Odometer e={e} /></div>
198
+
199
+ {/* 刻度线 */}
200
+ {[0, 1, 2, 3].map((g) => (
201
+ <div key={g} style={{ position: 'absolute', left: CH.x, width: CH.w, top: CH.y + (CH.h / 3) * g, height: 1, background: g === 3 ? alpha(L.ink, 0.25) : L.line }} />
202
+ ))}
203
+ {/* 柱子 */}
204
+ {BARS.map((b, i) => {
205
+ const top = barTop(i, e);
206
+ const hgt = CH.y + CH.h - top;
207
+ const hero = i === BARS.length - 1;
208
+ const lk = springAt(e, startOf(i) + GROW - 2, { damping: 15, stiffness: 200 });
209
+ return (
210
+ <React.Fragment key={i}>
211
+ <div style={{
212
+ position: 'absolute', left: barCx(i) - BAR_W / 2, top, width: BAR_W, height: hgt, borderRadius: '14px 14px 4px 4px',
213
+ background: hero
214
+ ? `linear-gradient(180deg, #8fb0ff 0%, ${L.accent} 30%, #2f55d8 100%)`
215
+ : `linear-gradient(180deg, #3a4b74 0%, #253252 100%)`,
216
+ boxShadow: hero
217
+ ? `inset 0 2px 0 rgba(255,255,255,0.5), 0 0 40px ${alpha(L.accent, 0.55)}`
218
+ : `inset 0 2px 0 rgba(255,255,255,0.18)`,
219
+ }} />
220
+ {/* 柱顶亮边(生长中的"刀口") */}
221
+ {growth(i, e) < 1 && growth(i, e) > 0 && (
222
+ <div style={{ position: 'absolute', left: barCx(i) - BAR_W / 2 - 6, top: top - 3, width: BAR_W + 12, height: 6, borderRadius: 3, background: '#dfe8ff', boxShadow: `0 0 18px ${alpha(L.accent, 0.9)}` }} />
223
+ )}
224
+ <div style={{
225
+ position: 'absolute', left: barCx(i) - 80, width: 160, top: CH.y + CH.h - CH.h * b - 54, textAlign: 'center',
226
+ ...type(36, 700), color: hero ? '#bcd0ff' : L.ink2, opacity: Math.min(1, lk * 1.4),
227
+ transform: `translateY(${((1 - lk) * 14).toFixed(2)}px) scale(${(0.8 + 0.2 * lk).toFixed(3)})`,
228
+ }}>
229
+ {Math.round(b * 31.4)}k
230
+ </div>
231
+ <div style={{ position: 'absolute', left: barCx(i) - 80, width: 160, top: CH.y + CH.h + 18, textAlign: 'center', ...type(26, 550), color: hero ? L.ink : L.ink3 }}>
232
+ {DAYS[i]}
233
+ </div>
234
+ </React.Fragment>
235
+ );
236
+ })}
237
+ {/* 冻结时面板表面的冷光(裁进圆角,跟相机角度横移) */}
238
+ <div style={{
239
+ position: 'absolute', inset: 0, pointerEvents: 'none', opacity: 0.5 * orbit,
240
+ background: `linear-gradient(105deg, transparent ${(30 + 50 * orbit).toFixed(1)}%, ${alpha('#cfdcff', 0.16)} ${(45 + 50 * orbit).toFixed(1)}%, transparent ${(60 + 50 * orbit).toFixed(1)}%)`,
241
+ }} />
242
+ </div>
243
+
244
+ {/* 火花(真实 z 深度,冻结时悬停并保留拖尾) */}
245
+ {SPARKS.map((s, idx) => {
246
+ const age = e - s.born;
247
+ if (age < 0 || age > s.life) return null;
248
+ const birthTop = barTop(s.bar, s.born);
249
+ const k = 1 - Math.exp(-age / s.tau);
250
+ const x = barCx(s.bar) + s.dx + s.vx * age - PANEL.w / 2;
251
+ const y = birthTop - s.v0 * s.tau * k - PANEL.h / 2;
252
+ const z = s.z * k;
253
+ const v = s.v0 * Math.exp(-age / s.tau); // 内容时钟下的速度
254
+ const len = s.size + v * 3.2;
255
+ const fade = Math.min(1, age / 3) * (1 - Math.pow(age / s.life, 2));
256
+ const c = s.hot ? '#ffffff' : '#9cb8ff';
257
+ return (
258
+ <div key={idx} style={{
259
+ position: 'absolute', left: x - s.size / 2, top: y, width: s.size, height: len, borderRadius: s.size,
260
+ transform: `translateZ(${z.toFixed(1)}px)`,
261
+ background: `linear-gradient(180deg, ${c} 0%, ${alpha(c, 0)} 100%)`,
262
+ boxShadow: `0 0 ${(s.size * 2).toFixed(1)}px ${alpha(L.accent, 0.8)}`,
263
+ opacity: fade * (0.85 + 0.15 * breathe),
264
+ }} />
265
+ );
266
+ })}
267
+ </div>
268
+ </AbsoluteFill>
269
+
270
+ {/* 冻结期暗角收拢(屏幕空间) */}
271
+ {frozen > 0.001 || chill > 0.001 ? (
272
+ <AbsoluteFill style={{
273
+ pointerEvents: 'none', opacity: chill,
274
+ background: `radial-gradient(ellipse 64% 64% at 50% 48%, ${alpha('#050a1c', 0)} 50%, ${alpha('#050a1c', 0.55)} 100%)`,
275
+ }} />
276
+ ) : null}
277
+ </AbsoluteFill>
278
+ );
279
+ };