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,250 +1,250 @@
1
- // basic-3d-scene — impress.js 式空间步进(第二轮重设计)
2
- // 手法不变:卡片散布在 3D 空间(各有 x·y·z + 旋转 + 缩放),相机取每站姿态之逆依次飞行对齐,
3
- // 末站拉远成 OVERVIEW 总览。核心配方 camera = stepTransform.inverse()。
4
- //
5
- // 设计决定
6
- // - look:graphite(近单色暗场,白为强调、香槟金只做点缀)——像发布会上"三章节"的空间叙事。
7
- // 产品是 video-shotcraft,三站 = 品牌短句拆成的三个章节:Frame / Craft / Ship,
8
- // 总览站是品牌落版「Craft the shot.」(标志 + 字标做眉题)。
9
- // - 卡片是为镜头设计的海报而不是小 UI:1240×700 原生 1:1 排版(对位时屏幕上就是原生像素,
10
- // 不经 DesignStage 放大,字不糊),150px 标题 + 44px 说明 + 420px 细体大号章节数字(被卡边裁切的编辑感)。
11
- // - 空间感:世界里散布 70 颗真 3D 浮尘(各有 z,相机飞/转时有真实视差);非当前卡按"站距"退焦变暗;
12
- // 飞行中段相机额外拉远 ~30%(hop)让观众看见"还有别的卡在空间里",再推近落位。
13
- // - 每站停留时卡底一条金色进度线走满(像幻灯片计时),停留段不是死帧;落位前 8f 标题逐词从线下升起,
14
- // 每张卡只揭示一次,之后在总览里保持已读状态。
15
- // - 运动模糊:飞行段做时间采样(快门 0.5f,子帧 3–8 个按相机位移自适应),停留段零开销。
16
- //
17
- // 时间表(30fps,225f = 7.5s)
18
- // 0–36 站 1 Capture:相机从 1.06 倍距离缓推到位(snappy 30f);2f 起标题逐词升起;进度线走满
19
- // 36–64 飞行 1→2(28f):右移 + 世界左转 38°,途中 hop 拉远 30%
20
- // 64–96 站 2 Connect 停留 32f
21
- // 96–128 飞行 2→3(32f):画框侧躺 90° 被转正——最长的一段,观众要看懂"世界在转"
22
- // 128–158 站 3 Ship 停留 30f
23
- // 158–190 飞行 3→总览(32f):相机 1/2.7 拉远,三卡与品牌落版同框
24
- // 184–212 落版:眉题字距收拢 → 「Craft the shot.」逐词升起 → 副句淡入
25
- // 206–224 hold:极缓推近 1.5%,尾帧是一张完整海报
26
- import React from 'react';
27
- import { AbsoluteFill, useCurrentFrame } from 'remotion';
28
- import { EASE, FONT, bezier, mix, ramp } from '../../_fixtures/Polish';
29
- import { LOOKS, SERIF, Stage, TextReveal, alpha, type } from '../../_fixtures/Look';
30
- import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
31
-
32
- export const BASIC_3D_SCENE_DURATION = 225; // 7.5s @30fps
33
-
34
- const L = LOOKS.graphite;
35
- const GOLD = L.accent2;
36
- const CW = 1240; // 卡片原生尺寸(对位时屏幕 1:1)
37
- const CH = 700;
38
- const PERSP = 2600;
39
-
40
- type Pose = { x: number; y: number; z: number; rx: number; ry: number; rz: number; s: number };
41
- // 每站:卡片自己的 pose(相机取其逆)。站 2 世界左转 38°、站 3 画框侧躺 90°、总览 s=2.7 拉远
42
- const POSES: Pose[] = [
43
- { x: 0, y: 0, z: 0, rx: 0, ry: 0, rz: 0, s: 1 },
44
- { x: 1690, y: -260, z: -650, rx: 0, ry: -38, rz: 0, s: 1 },
45
- { x: 2590, y: 830, z: -850, rx: 0, ry: 0, rz: 90, s: 1 },
46
- { x: 594, y: 480, z: -400, rx: 0, ry: 0, rz: 0, s: 2.7 },
47
- ];
48
- const CHAPTERS = [
49
- { no: '01', kicker: 'Frame', title: 'Frame.', body: 'Real page captures, staged for the camera.' },
50
- { no: '02', kicker: 'Craft', title: 'Craft.', body: 'Shot recipe cards turn moves into code.' },
51
- { no: '03', kicker: 'Ship', title: 'Ship.', body: 'One prompt to a finished promo.' },
52
- ];
53
-
54
- // 飞行时刻表(帧):[起, 止]
55
- const FLIGHTS: [number, number][] = [[36, 64], [96, 128], [158, 190]];
56
- const ARRIVE = [0, 64, 128, 190]; // 每站落位帧(站 0 开场即在)
57
- const HOLD_END = [36, 96, 158, 225];
58
- const FLY_EASE = bezier(0.62, 0, 0.16, 1); // 起步稳、落位很软的不对称 in-out
59
- const HOP = 0.3; // 站间飞行途中额外拉远比例
60
-
61
- // 相机姿态(帧的纯函数,可取小数帧:运动模糊子帧采样用)
62
- const camAt = (f: number) => {
63
- const cam: Pose = { ...POSES[0] };
64
- // 开场:从 1.06 倍距离缓推到位(不是死帧起手)
65
- cam.s = mix(1.06, 1, ramp(f, 0, 30, EASE.snappy));
66
- let af = 0; // 累计飞行进度(0..3,小数 = 途中)
67
- let hop = 0;
68
- FLIGHTS.forEach(([a, b], i) => {
69
- const u = ramp(f, a, b - a, FLY_EASE);
70
- af += u;
71
- const p = POSES[i + 1];
72
- (Object.keys(cam) as (keyof Pose)[]).forEach((k) => {
73
- cam[k] = mix(cam[k], p[k], u);
74
- });
75
- if (i < 2 && u > 0 && u < 1) hop = HOP * Math.sin(Math.PI * u);
76
- });
77
- cam.s *= 1 + hop;
78
- // 停留段极缓推近 1.5%:落位后慢慢吃进去,下一段飞行起步时同曲线还原(画面活着但不晃)
79
- let creep = 0;
80
- for (let i = 0; i < 3; i++) {
81
- creep += ramp(f, ARRIVE[i] + 4, HOLD_END[i] - ARRIVE[i], EASE.smooth) * (1 - ramp(f, FLIGHTS[i][0], 14, EASE.smooth));
82
- }
83
- cam.s *= 1 - 0.015 * creep;
84
- // 总览落定后极缓推近 1.5%(hold 段活着,不晃)
85
- cam.s *= 1 - 0.015 * ramp(f, 196, 29, EASE.smooth);
86
- return { cam, af };
87
- };
88
-
89
- const camTransform = (c: Pose) =>
90
- `scale(${(1 / c.s).toFixed(5)}) rotateZ(${(-c.rz).toFixed(4)}deg) rotateY(${(-c.ry).toFixed(4)}deg) rotateX(${(-c.rx).toFixed(4)}deg) translate3d(${(-c.x).toFixed(3)}px,${(-c.y).toFixed(3)}px,${(-c.z).toFixed(3)}px)`;
91
- const poseTransform = (p: Pose) =>
92
- `translate3d(${p.x}px,${p.y}px,${p.z}px) rotateX(${p.rx}deg) rotateY(${p.ry}deg) rotateZ(${p.rz}deg) scale(${p.s})`;
93
-
94
- const hash = (n: number) => {
95
- const x = Math.sin(n * 91.345 + 47.853) * 43758.5453;
96
- return x - Math.floor(x);
97
- };
98
- // 世界里的真 3D 浮尘:位置固定在世界坐标,视差全部来自相机
99
- const MOTES = Array.from({ length: 70 }, (_, i) => ({
100
- x: -2600 + hash(i * 3.1) * 6800,
101
- y: -2000 + hash(i * 5.7 + 1) * 4800,
102
- z: -3200 + hash(i * 7.3 + 2) * 3600,
103
- r: 3 + hash(i * 11.9 + 3) * 7,
104
- a: 0.25 + hash(i * 13.1 + 4) * 0.55,
105
- }));
106
-
107
- // ───────── 章节卡 ─────────
108
- const ChapterCard: React.FC<{ i: number; frame: number; focus: number }> = ({ i, frame, focus }) => {
109
- const c = CHAPTERS[i];
110
- const arrive = ARRIVE[i];
111
- const reveal = arrive - (i === 0 ? -2 : 8); // 标题在落位前一拍开始升起
112
- const hold = ramp(frame, arrive, HOLD_END[i] - arrive, EASE.smooth); // 进度线
113
- const numIn = ramp(frame, reveal - 4, 26, EASE.out);
114
- const bodyIn = ramp(frame, reveal + 8, 18, EASE.out);
115
- return (
116
- <div style={{ position: 'absolute', inset: 0, padding: '74px 84px', boxSizing: 'border-box', fontFamily: FONT.sans }}>
117
- {/* 细体大号章节数字:被卡右缘裁掉一截(编辑感),只做纹理层 */}
118
- <div style={{
119
- position: 'absolute', right: -36, bottom: -118, ...type(560, 200), letterSpacing: '-0.06em',
120
- color: 'transparent', backgroundImage: `linear-gradient(170deg, ${alpha('#ffffff', 0.16)} 10%, ${alpha('#ffffff', 0.02)} 70%)`,
121
- WebkitBackgroundClip: 'text', backgroundClip: 'text',
122
- transform: `translateY(${((1 - numIn) * 60).toFixed(1)}px)`, opacity: numIn,
123
- }}>{c.no}</div>
124
- {/* 眉题 */}
125
- <div style={{ display: 'flex', alignItems: 'center', gap: 18, ...type(26, 600, { mono: true }), letterSpacing: '0.14em', color: L.ink3, textTransform: 'uppercase' }}>
126
- <span style={{ color: GOLD }}>{c.no}</span>
127
- <span style={{ width: 44, height: 1, background: alpha(GOLD, 0.6) }} />
128
- <span>Chapter · {c.kicker}</span>
129
- <span style={{ marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 12, textTransform: 'none', fontFamily: BRAND.font, fontSize: 28, fontWeight: 700, letterSpacing: '0.03em', color: L.ink2 }}>
130
- <ShotcraftMark size={32} tone="dark" />{BRAND.name}
131
- </span>
132
- </div>
133
- {/* 标题:逐词从线下升起 */}
134
- <div style={{ marginTop: 150, ...type(156, 760), color: L.ink }}>
135
- <TextReveal text={c.title} by="char" variant="rise" start={reveal} each={20} gap={1.8} />
136
- </div>
137
- <div style={{
138
- marginTop: 34, maxWidth: 820, ...type(44, 420), lineHeight: 1.3, color: L.ink2, textWrap: 'balance',
139
- opacity: bodyIn, transform: `translateY(${((1 - bodyIn) * 18).toFixed(1)}px)`,
140
- }}>{c.body}</div>
141
- {/* 底部:三段章节进度,当前段金色走满 */}
142
- <div style={{ position: 'absolute', left: 84, right: 84, bottom: 70, display: 'flex', gap: 14 }}>
143
- {[0, 1, 2].map((k) => (
144
- <div key={k} style={{ flex: 1, height: 3, borderRadius: 2, background: alpha('#ffffff', 0.1), overflow: 'hidden' }}>
145
- <div style={{
146
- height: '100%', width: `${(k < i ? 1 : k === i ? hold : 0) * 100}%`,
147
- background: k === i ? `linear-gradient(90deg, ${alpha(GOLD, 0.7)}, ${GOLD})` : alpha('#ffffff', 0.45),
148
- boxShadow: k === i ? `0 0 ${10 * focus}px ${alpha(GOLD, 0.6)}` : undefined,
149
- }} />
150
- </div>
151
- ))}
152
- </div>
153
- </div>
154
- );
155
- };
156
-
157
- // ───────── 总览落版(世界里挂在总览站:放大 s 倍排版,相机 1/s 看回来 = 屏幕 1:1) ─────────
158
- const OverviewPlate: React.FC<{ frame: number }> = ({ frame }) => {
159
- const st = 184;
160
- const kick = ramp(frame, st, 22, EASE.snappy);
161
- const sub = ramp(frame, st + 20, 18, EASE.out);
162
- return (
163
- <div style={{ position: 'absolute', left: -960, top: -540, width: 1920, height: 1080, pointerEvents: 'none' }}>
164
- <div style={{ position: 'absolute', left: 120, bottom: 128 }}>
165
- <div style={{ display: 'flex', alignItems: 'center', gap: 16, ...type(24, 600, { mono: true }), letterSpacing: `${mix(0.6, 0.16, kick).toFixed(3)}em`, color: GOLD, opacity: kick, textTransform: 'uppercase' }}>
166
- <ShotcraftMark size={40} tone="dark" />
167
- <span style={{ textTransform: 'none', fontFamily: BRAND.font, fontSize: 30, fontWeight: 700, letterSpacing: '0.03em', color: L.ink }}>{BRAND.name}</span>
168
- <span>· Three chapters, one film</span>
169
- </div>
170
- <div style={{ marginTop: 26, ...type(150, 400, { serif: true }), letterSpacing: '-0.035em', color: L.ink }}>
171
- <TextReveal text="Craft the shot." by="word" variant="rise" start={st + 6} each={22} gap={5} />
172
- </div>
173
- <div style={{ marginTop: 22, ...type(38, 420), color: L.ink2, opacity: sub, transform: `translateY(${((1 - sub) * 14).toFixed(1)}px)` }}>
174
- Shot recipes for cinematic product films.
175
- </div>
176
- </div>
177
- </div>
178
- );
179
- };
180
-
181
- // 一个完整的世界(给定帧,可为小数帧)
182
- const World: React.FC<{ f: number; frame: number }> = ({ f, frame }) => {
183
- const { cam, af } = camAt(f);
184
- const over = ramp(f, FLIGHTS[2][0], FLIGHTS[2][1] - FLIGHTS[2][0], EASE.smooth);
185
- const plateOn = ramp(frame, 176, 16, EASE.out);
186
- return (
187
- <div style={{ position: 'absolute', left: '50%', top: '50%', width: 0, height: 0, transformStyle: 'preserve-3d', transform: camTransform(cam) }}>
188
- {MOTES.map((m, k) => (
189
- <div key={k} style={{
190
- position: 'absolute', left: -m.r, top: -m.r, width: m.r * 2, height: m.r * 2, borderRadius: '50%',
191
- transform: `translate3d(${m.x}px,${m.y}px,${m.z}px)`,
192
- background: `radial-gradient(circle, ${alpha('#f4efe4', m.a)} 0%, ${alpha('#f4efe4', 0)} 70%)`,
193
- }} />
194
- ))}
195
- {CHAPTERS.map((_, i) => {
196
- const p = POSES[i];
197
- // enter/exit:按"站距"退焦变暗;总览时全部回到可读(但略压暗,给落版让主次)
198
- const d = Math.min(1, Math.abs(af - i));
199
- const focus = Math.max(1 - d, over * 0.85);
200
- const lift = (1 - d) * 18;
201
- return (
202
- <div key={i} style={{
203
- position: 'absolute', left: -CW / 2, top: -CH / 2, width: CW, height: CH, borderRadius: 34, overflow: 'hidden',
204
- transform: `${poseTransform(p)} translateZ(${lift.toFixed(2)}px)`,
205
- background: `radial-gradient(ellipse 80% 90% at 18% 0%, ${alpha('#ffffff', 0.07)} 0%, ${alpha('#ffffff', 0)} 60%), linear-gradient(165deg, #202226 0%, #16171a 55%, #111214 100%)`,
206
- border: `1.5px solid ${alpha('#ffffff', 0.08 + 0.08 * focus)}`,
207
- boxShadow: `inset 0 1.5px 0 ${alpha('#ffffff', 0.12)}, 0 30px 80px -10px rgba(0,0,0,0.7), 0 6px 18px rgba(0,0,0,0.5)`,
208
- opacity: 0.22 + 0.78 * focus,
209
- filter: focus < 0.985 ? `blur(${((1 - focus) * 7).toFixed(2)}px)` : undefined,
210
- }}>
211
- {/* 顶沿受光线:中间亮两端隐 */}
212
- <div style={{ position: 'absolute', left: 0, right: 0, top: 0, height: 2, background: `linear-gradient(90deg, transparent, ${alpha('#ffffff', 0.35 * (0.4 + 0.6 * focus))}, transparent)` }} />
213
- <ChapterCard i={i} frame={frame} focus={focus} />
214
- </div>
215
- );
216
- })}
217
- {/* 总览落版:在总览站姿态上(放大 2.7 倍排版),只在最后一段飞行开始显影 */}
218
- <div style={{ position: 'absolute', left: 0, top: 0, transform: poseTransform(POSES[3]), opacity: plateOn }}>
219
- <OverviewPlate frame={frame} />
220
- </div>
221
- </div>
222
- );
223
- };
224
-
225
- // 飞行段时间采样:快门 0.5 帧内 N 个子帧逐层 opacity 1/(i+1) 叠加 = 等权平均;N 按相机位移自适应
226
- const SHUTTER = 0.5;
227
- const samplesAt = (f: number) => {
228
- const a = camAt(f).cam, b = camAt(f - SHUTTER).cam;
229
- const disp = Math.hypot(a.x - b.x, a.y - b.y) / a.s + Math.abs(a.z - b.z) * 0.4
230
- + (Math.abs(a.ry - b.ry) + Math.abs(a.rz - b.rz)) * 14 + Math.abs(Math.log(a.s / b.s)) * 1400;
231
- return Math.max(1, Math.min(8, Math.ceil(disp / 5)));
232
- };
233
-
234
- export const Basic3DScene: React.FC = () => {
235
- const frame = useCurrentFrame();
236
- const flying = FLIGHTS.some(([a, b]) => frame > a && frame < b);
237
- const n = flying ? samplesAt(frame) : 1;
238
- return (
239
- <AbsoluteFill style={{ background: L.bg[2] }}>
240
- <Stage look={L} keyLight={{ x: 0.5, y: -0.08 }} fill={{ x: 0.85, y: 1.05 }} breathe={0.6} intensity={0.55} />
241
- <AbsoluteFill style={{ overflow: 'hidden' }}>
242
- {Array.from({ length: n }, (_, i) => (
243
- <AbsoluteFill key={i} style={{ perspective: `${PERSP}px`, opacity: 1 / (i + 1) }}>
244
- <World f={n > 1 ? frame - (SHUTTER * i) / (n - 1) : frame} frame={frame} />
245
- </AbsoluteFill>
246
- ))}
247
- </AbsoluteFill>
248
- </AbsoluteFill>
249
- );
250
- };
1
+ // basic-3d-scene — impress.js 式空间步进(第二轮重设计)
2
+ // 手法不变:卡片散布在 3D 空间(各有 x·y·z + 旋转 + 缩放),相机取每站姿态之逆依次飞行对齐,
3
+ // 末站拉远成 OVERVIEW 总览。核心配方 camera = stepTransform.inverse()。
4
+ //
5
+ // 设计决定
6
+ // - look:graphite(近单色暗场,白为强调、香槟金只做点缀)——像发布会上"三章节"的空间叙事。
7
+ // 产品是 video-shotcraft,三站 = 品牌短句拆成的三个章节:Frame / Craft / Ship,
8
+ // 总览站是品牌落版「Craft the shot.」(标志 + 字标做眉题)。
9
+ // - 卡片是为镜头设计的海报而不是小 UI:1240×700 原生 1:1 排版(对位时屏幕上就是原生像素,
10
+ // 不经 DesignStage 放大,字不糊),150px 标题 + 44px 说明 + 420px 细体大号章节数字(被卡边裁切的编辑感)。
11
+ // - 空间感:世界里散布 70 颗真 3D 浮尘(各有 z,相机飞/转时有真实视差);非当前卡按"站距"退焦变暗;
12
+ // 飞行中段相机额外拉远 ~30%(hop)让观众看见"还有别的卡在空间里",再推近落位。
13
+ // - 每站停留时卡底一条金色进度线走满(像幻灯片计时),停留段不是死帧;落位前 8f 标题逐词从线下升起,
14
+ // 每张卡只揭示一次,之后在总览里保持已读状态。
15
+ // - 运动模糊:飞行段做时间采样(快门 0.5f,子帧 3–8 个按相机位移自适应),停留段零开销。
16
+ //
17
+ // 时间表(30fps,225f = 7.5s)
18
+ // 0–36 站 1 Capture:相机从 1.06 倍距离缓推到位(snappy 30f);2f 起标题逐词升起;进度线走满
19
+ // 36–64 飞行 1→2(28f):右移 + 世界左转 38°,途中 hop 拉远 30%
20
+ // 64–96 站 2 Connect 停留 32f
21
+ // 96–128 飞行 2→3(32f):画框侧躺 90° 被转正——最长的一段,观众要看懂"世界在转"
22
+ // 128–158 站 3 Ship 停留 30f
23
+ // 158–190 飞行 3→总览(32f):相机 1/2.7 拉远,三卡与品牌落版同框
24
+ // 184–212 落版:眉题字距收拢 → 「Craft the shot.」逐词升起 → 副句淡入
25
+ // 206–224 hold:极缓推近 1.5%,尾帧是一张完整海报
26
+ import React from 'react';
27
+ import { AbsoluteFill, useCurrentFrame } from 'remotion';
28
+ import { EASE, FONT, bezier, mix, ramp } from '../../_fixtures/Polish';
29
+ import { LOOKS, SERIF, Stage, TextReveal, alpha, type } from '../../_fixtures/Look';
30
+ import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
31
+
32
+ export const BASIC_3D_SCENE_DURATION = 225; // 7.5s @30fps
33
+
34
+ const L = LOOKS.graphite;
35
+ const GOLD = L.accent2;
36
+ const CW = 1240; // 卡片原生尺寸(对位时屏幕 1:1)
37
+ const CH = 700;
38
+ const PERSP = 2600;
39
+
40
+ type Pose = { x: number; y: number; z: number; rx: number; ry: number; rz: number; s: number };
41
+ // 每站:卡片自己的 pose(相机取其逆)。站 2 世界左转 38°、站 3 画框侧躺 90°、总览 s=2.7 拉远
42
+ const POSES: Pose[] = [
43
+ { x: 0, y: 0, z: 0, rx: 0, ry: 0, rz: 0, s: 1 },
44
+ { x: 1690, y: -260, z: -650, rx: 0, ry: -38, rz: 0, s: 1 },
45
+ { x: 2590, y: 830, z: -850, rx: 0, ry: 0, rz: 90, s: 1 },
46
+ { x: 594, y: 480, z: -400, rx: 0, ry: 0, rz: 0, s: 2.7 },
47
+ ];
48
+ const CHAPTERS = [
49
+ { no: '01', kicker: 'Frame', title: 'Frame.', body: 'Real page captures, staged for the camera.' },
50
+ { no: '02', kicker: 'Craft', title: 'Craft.', body: 'Shot recipe cards turn moves into code.' },
51
+ { no: '03', kicker: 'Ship', title: 'Ship.', body: 'One prompt to a finished promo.' },
52
+ ];
53
+
54
+ // 飞行时刻表(帧):[起, 止]
55
+ const FLIGHTS: [number, number][] = [[36, 64], [96, 128], [158, 190]];
56
+ const ARRIVE = [0, 64, 128, 190]; // 每站落位帧(站 0 开场即在)
57
+ const HOLD_END = [36, 96, 158, 225];
58
+ const FLY_EASE = bezier(0.62, 0, 0.16, 1); // 起步稳、落位很软的不对称 in-out
59
+ const HOP = 0.3; // 站间飞行途中额外拉远比例
60
+
61
+ // 相机姿态(帧的纯函数,可取小数帧:运动模糊子帧采样用)
62
+ const camAt = (f: number) => {
63
+ const cam: Pose = { ...POSES[0] };
64
+ // 开场:从 1.06 倍距离缓推到位(不是死帧起手)
65
+ cam.s = mix(1.06, 1, ramp(f, 0, 30, EASE.snappy));
66
+ let af = 0; // 累计飞行进度(0..3,小数 = 途中)
67
+ let hop = 0;
68
+ FLIGHTS.forEach(([a, b], i) => {
69
+ const u = ramp(f, a, b - a, FLY_EASE);
70
+ af += u;
71
+ const p = POSES[i + 1];
72
+ (Object.keys(cam) as (keyof Pose)[]).forEach((k) => {
73
+ cam[k] = mix(cam[k], p[k], u);
74
+ });
75
+ if (i < 2 && u > 0 && u < 1) hop = HOP * Math.sin(Math.PI * u);
76
+ });
77
+ cam.s *= 1 + hop;
78
+ // 停留段极缓推近 1.5%:落位后慢慢吃进去,下一段飞行起步时同曲线还原(画面活着但不晃)
79
+ let creep = 0;
80
+ for (let i = 0; i < 3; i++) {
81
+ creep += ramp(f, ARRIVE[i] + 4, HOLD_END[i] - ARRIVE[i], EASE.smooth) * (1 - ramp(f, FLIGHTS[i][0], 14, EASE.smooth));
82
+ }
83
+ cam.s *= 1 - 0.015 * creep;
84
+ // 总览落定后极缓推近 1.5%(hold 段活着,不晃)
85
+ cam.s *= 1 - 0.015 * ramp(f, 196, 29, EASE.smooth);
86
+ return { cam, af };
87
+ };
88
+
89
+ const camTransform = (c: Pose) =>
90
+ `scale(${(1 / c.s).toFixed(5)}) rotateZ(${(-c.rz).toFixed(4)}deg) rotateY(${(-c.ry).toFixed(4)}deg) rotateX(${(-c.rx).toFixed(4)}deg) translate3d(${(-c.x).toFixed(3)}px,${(-c.y).toFixed(3)}px,${(-c.z).toFixed(3)}px)`;
91
+ const poseTransform = (p: Pose) =>
92
+ `translate3d(${p.x}px,${p.y}px,${p.z}px) rotateX(${p.rx}deg) rotateY(${p.ry}deg) rotateZ(${p.rz}deg) scale(${p.s})`;
93
+
94
+ const hash = (n: number) => {
95
+ const x = Math.sin(n * 91.345 + 47.853) * 43758.5453;
96
+ return x - Math.floor(x);
97
+ };
98
+ // 世界里的真 3D 浮尘:位置固定在世界坐标,视差全部来自相机
99
+ const MOTES = Array.from({ length: 70 }, (_, i) => ({
100
+ x: -2600 + hash(i * 3.1) * 6800,
101
+ y: -2000 + hash(i * 5.7 + 1) * 4800,
102
+ z: -3200 + hash(i * 7.3 + 2) * 3600,
103
+ r: 3 + hash(i * 11.9 + 3) * 7,
104
+ a: 0.25 + hash(i * 13.1 + 4) * 0.55,
105
+ }));
106
+
107
+ // ───────── 章节卡 ─────────
108
+ const ChapterCard: React.FC<{ i: number; frame: number; focus: number }> = ({ i, frame, focus }) => {
109
+ const c = CHAPTERS[i];
110
+ const arrive = ARRIVE[i];
111
+ const reveal = arrive - (i === 0 ? -2 : 8); // 标题在落位前一拍开始升起
112
+ const hold = ramp(frame, arrive, HOLD_END[i] - arrive, EASE.smooth); // 进度线
113
+ const numIn = ramp(frame, reveal - 4, 26, EASE.out);
114
+ const bodyIn = ramp(frame, reveal + 8, 18, EASE.out);
115
+ return (
116
+ <div style={{ position: 'absolute', inset: 0, padding: '74px 84px', boxSizing: 'border-box', fontFamily: FONT.sans }}>
117
+ {/* 细体大号章节数字:被卡右缘裁掉一截(编辑感),只做纹理层 */}
118
+ <div style={{
119
+ position: 'absolute', right: -36, bottom: -118, ...type(560, 200), letterSpacing: '-0.06em',
120
+ color: 'transparent', backgroundImage: `linear-gradient(170deg, ${alpha('#ffffff', 0.16)} 10%, ${alpha('#ffffff', 0.02)} 70%)`,
121
+ WebkitBackgroundClip: 'text', backgroundClip: 'text',
122
+ transform: `translateY(${((1 - numIn) * 60).toFixed(1)}px)`, opacity: numIn,
123
+ }}>{c.no}</div>
124
+ {/* 眉题 */}
125
+ <div style={{ display: 'flex', alignItems: 'center', gap: 18, ...type(26, 600, { mono: true }), letterSpacing: '0.14em', color: L.ink3, textTransform: 'uppercase' }}>
126
+ <span style={{ color: GOLD }}>{c.no}</span>
127
+ <span style={{ width: 44, height: 1, background: alpha(GOLD, 0.6) }} />
128
+ <span>Chapter · {c.kicker}</span>
129
+ <span style={{ marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 12, textTransform: 'none', fontFamily: BRAND.font, fontSize: 28, fontWeight: 700, letterSpacing: '0.03em', color: L.ink2 }}>
130
+ <ShotcraftMark size={32} tone="dark" />{BRAND.name}
131
+ </span>
132
+ </div>
133
+ {/* 标题:逐词从线下升起 */}
134
+ <div style={{ marginTop: 150, ...type(156, 760), color: L.ink }}>
135
+ <TextReveal text={c.title} by="char" variant="rise" start={reveal} each={20} gap={1.8} />
136
+ </div>
137
+ <div style={{
138
+ marginTop: 34, maxWidth: 820, ...type(44, 420), lineHeight: 1.3, color: L.ink2, textWrap: 'balance',
139
+ opacity: bodyIn, transform: `translateY(${((1 - bodyIn) * 18).toFixed(1)}px)`,
140
+ }}>{c.body}</div>
141
+ {/* 底部:三段章节进度,当前段金色走满 */}
142
+ <div style={{ position: 'absolute', left: 84, right: 84, bottom: 70, display: 'flex', gap: 14 }}>
143
+ {[0, 1, 2].map((k) => (
144
+ <div key={k} style={{ flex: 1, height: 3, borderRadius: 2, background: alpha('#ffffff', 0.1), overflow: 'hidden' }}>
145
+ <div style={{
146
+ height: '100%', width: `${(k < i ? 1 : k === i ? hold : 0) * 100}%`,
147
+ background: k === i ? `linear-gradient(90deg, ${alpha(GOLD, 0.7)}, ${GOLD})` : alpha('#ffffff', 0.45),
148
+ boxShadow: k === i ? `0 0 ${10 * focus}px ${alpha(GOLD, 0.6)}` : undefined,
149
+ }} />
150
+ </div>
151
+ ))}
152
+ </div>
153
+ </div>
154
+ );
155
+ };
156
+
157
+ // ───────── 总览落版(世界里挂在总览站:放大 s 倍排版,相机 1/s 看回来 = 屏幕 1:1) ─────────
158
+ const OverviewPlate: React.FC<{ frame: number }> = ({ frame }) => {
159
+ const st = 184;
160
+ const kick = ramp(frame, st, 22, EASE.snappy);
161
+ const sub = ramp(frame, st + 20, 18, EASE.out);
162
+ return (
163
+ <div style={{ position: 'absolute', left: -960, top: -540, width: 1920, height: 1080, pointerEvents: 'none' }}>
164
+ <div style={{ position: 'absolute', left: 120, bottom: 128 }}>
165
+ <div style={{ display: 'flex', alignItems: 'center', gap: 16, ...type(24, 600, { mono: true }), letterSpacing: `${mix(0.6, 0.16, kick).toFixed(3)}em`, color: GOLD, opacity: kick, textTransform: 'uppercase' }}>
166
+ <ShotcraftMark size={40} tone="dark" />
167
+ <span style={{ textTransform: 'none', fontFamily: BRAND.font, fontSize: 30, fontWeight: 700, letterSpacing: '0.03em', color: L.ink }}>{BRAND.name}</span>
168
+ <span>· Three chapters, one film</span>
169
+ </div>
170
+ <div style={{ marginTop: 26, ...type(150, 400, { serif: true }), letterSpacing: '-0.035em', color: L.ink }}>
171
+ <TextReveal text="Craft the shot." by="word" variant="rise" start={st + 6} each={22} gap={5} />
172
+ </div>
173
+ <div style={{ marginTop: 22, ...type(38, 420), color: L.ink2, opacity: sub, transform: `translateY(${((1 - sub) * 14).toFixed(1)}px)` }}>
174
+ Shot recipes for cinematic product films.
175
+ </div>
176
+ </div>
177
+ </div>
178
+ );
179
+ };
180
+
181
+ // 一个完整的世界(给定帧,可为小数帧)
182
+ const World: React.FC<{ f: number; frame: number }> = ({ f, frame }) => {
183
+ const { cam, af } = camAt(f);
184
+ const over = ramp(f, FLIGHTS[2][0], FLIGHTS[2][1] - FLIGHTS[2][0], EASE.smooth);
185
+ const plateOn = ramp(frame, 176, 16, EASE.out);
186
+ return (
187
+ <div style={{ position: 'absolute', left: '50%', top: '50%', width: 0, height: 0, transformStyle: 'preserve-3d', transform: camTransform(cam) }}>
188
+ {MOTES.map((m, k) => (
189
+ <div key={k} style={{
190
+ position: 'absolute', left: -m.r, top: -m.r, width: m.r * 2, height: m.r * 2, borderRadius: '50%',
191
+ transform: `translate3d(${m.x}px,${m.y}px,${m.z}px)`,
192
+ background: `radial-gradient(circle, ${alpha('#f4efe4', m.a)} 0%, ${alpha('#f4efe4', 0)} 70%)`,
193
+ }} />
194
+ ))}
195
+ {CHAPTERS.map((_, i) => {
196
+ const p = POSES[i];
197
+ // enter/exit:按"站距"退焦变暗;总览时全部回到可读(但略压暗,给落版让主次)
198
+ const d = Math.min(1, Math.abs(af - i));
199
+ const focus = Math.max(1 - d, over * 0.85);
200
+ const lift = (1 - d) * 18;
201
+ return (
202
+ <div key={i} style={{
203
+ position: 'absolute', left: -CW / 2, top: -CH / 2, width: CW, height: CH, borderRadius: 34, overflow: 'hidden',
204
+ transform: `${poseTransform(p)} translateZ(${lift.toFixed(2)}px)`,
205
+ background: `radial-gradient(ellipse 80% 90% at 18% 0%, ${alpha('#ffffff', 0.07)} 0%, ${alpha('#ffffff', 0)} 60%), linear-gradient(165deg, #202226 0%, #16171a 55%, #111214 100%)`,
206
+ border: `1.5px solid ${alpha('#ffffff', 0.08 + 0.08 * focus)}`,
207
+ boxShadow: `inset 0 1.5px 0 ${alpha('#ffffff', 0.12)}, 0 30px 80px -10px rgba(0,0,0,0.7), 0 6px 18px rgba(0,0,0,0.5)`,
208
+ opacity: 0.22 + 0.78 * focus,
209
+ filter: focus < 0.985 ? `blur(${((1 - focus) * 7).toFixed(2)}px)` : undefined,
210
+ }}>
211
+ {/* 顶沿受光线:中间亮两端隐 */}
212
+ <div style={{ position: 'absolute', left: 0, right: 0, top: 0, height: 2, background: `linear-gradient(90deg, transparent, ${alpha('#ffffff', 0.35 * (0.4 + 0.6 * focus))}, transparent)` }} />
213
+ <ChapterCard i={i} frame={frame} focus={focus} />
214
+ </div>
215
+ );
216
+ })}
217
+ {/* 总览落版:在总览站姿态上(放大 2.7 倍排版),只在最后一段飞行开始显影 */}
218
+ <div style={{ position: 'absolute', left: 0, top: 0, transform: poseTransform(POSES[3]), opacity: plateOn }}>
219
+ <OverviewPlate frame={frame} />
220
+ </div>
221
+ </div>
222
+ );
223
+ };
224
+
225
+ // 飞行段时间采样:快门 0.5 帧内 N 个子帧逐层 opacity 1/(i+1) 叠加 = 等权平均;N 按相机位移自适应
226
+ const SHUTTER = 0.5;
227
+ const samplesAt = (f: number) => {
228
+ const a = camAt(f).cam, b = camAt(f - SHUTTER).cam;
229
+ const disp = Math.hypot(a.x - b.x, a.y - b.y) / a.s + Math.abs(a.z - b.z) * 0.4
230
+ + (Math.abs(a.ry - b.ry) + Math.abs(a.rz - b.rz)) * 14 + Math.abs(Math.log(a.s / b.s)) * 1400;
231
+ return Math.max(1, Math.min(8, Math.ceil(disp / 5)));
232
+ };
233
+
234
+ export const Basic3DScene: React.FC = () => {
235
+ const frame = useCurrentFrame();
236
+ const flying = FLIGHTS.some(([a, b]) => frame > a && frame < b);
237
+ const n = flying ? samplesAt(frame) : 1;
238
+ return (
239
+ <AbsoluteFill style={{ background: L.bg[2] }}>
240
+ <Stage look={L} keyLight={{ x: 0.5, y: -0.08 }} fill={{ x: 0.85, y: 1.05 }} breathe={0.6} intensity={0.55} />
241
+ <AbsoluteFill style={{ overflow: 'hidden' }}>
242
+ {Array.from({ length: n }, (_, i) => (
243
+ <AbsoluteFill key={i} style={{ perspective: `${PERSP}px`, opacity: 1 / (i + 1) }}>
244
+ <World f={n > 1 ? frame - (SHUTTER * i) / (n - 1) : frame} frame={frame} />
245
+ </AbsoluteFill>
246
+ ))}
247
+ </AbsoluteFill>
248
+ </AbsoluteFill>
249
+ );
250
+ };