dsh-drawai 0.4.2 → 0.4.4

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 (379) hide show
  1. package/README.md +7 -5
  2. package/lib/client.js +142 -16
  3. package/lib/index.js +7945 -7719
  4. package/lib/motion/asset-pack.js +394 -394
  5. package/lib/motion/assets.js +291 -291
  6. package/lib/motion/demo-assets-lock.js +10 -10
  7. package/lib/motion/mgstyles/briefs/23-ink-wash.md +147 -0
  8. package/lib/motion/mgstyles/catalog.d/23-ink-wash.json +28 -0
  9. package/lib/motion/mgstyles/catalog.json +127 -14
  10. package/lib/motion/mgstyles/upstream/demos/23-ink-wash/brush.js +149 -0
  11. package/lib/motion/mgstyles/upstream/demos/23-ink-wash/film.js +202 -0
  12. package/lib/motion/mgstyles/upstream/manifest.json +28 -3
  13. package/lib/motion/mgstyles/upstream/prompts/23-ink-wash.md +59 -0
  14. package/lib/motion/mgstyles/vendor/README.md +28 -28
  15. package/lib/motion/mgstyles/vendor/modules/d3/LICENSE +13 -13
  16. package/lib/motion/mgstyles/vendor/modules/d3/dist/d3.min.js +2 -2
  17. package/lib/motion/mgstyles/vendor/modules/opentype.js/LICENSE +20 -20
  18. package/lib/motion/mgstyles/vendor/modules/opentype.js/dist/opentype.mjs +14460 -14460
  19. package/lib/motion/mgstyles/vendor/modules/simplex-noise/LICENSE +21 -21
  20. package/lib/motion/mgstyles/vendor/modules/simplex-noise/dist/esm/simplex-noise.js +465 -465
  21. package/lib/motion/mgstyles/vendor/modules/topojson-client/LICENSE +13 -13
  22. package/lib/motion/mgstyles/vendor/modules/topojson-client/dist/topojson-client.min.js +2 -2
  23. package/lib/motion/project.js +5 -1
  24. package/lib/motion/qa.js +116 -6
  25. package/lib/motion/render.js +179 -179
  26. package/lib/motion/scene-kit.js +1 -1
  27. package/lib/motion/shotcraft/upstream/SKILL.md +286 -286
  28. package/lib/motion/shotcraft/upstream/assets/lib/Caption.tsx +54 -54
  29. package/lib/motion/shotcraft/upstream/assets/lib/ClipCard.tsx +200 -200
  30. package/lib/motion/shotcraft/upstream/assets/lib/DigitRoll.tsx +45 -45
  31. package/lib/motion/shotcraft/upstream/assets/lib/FlashCut.tsx +20 -20
  32. package/lib/motion/shotcraft/upstream/assets/lib/FlatPanel.tsx +65 -65
  33. package/lib/motion/shotcraft/upstream/assets/lib/PageCam.tsx +151 -151
  34. package/lib/motion/shotcraft/upstream/assets/lib/VerticalTicker.tsx +129 -129
  35. package/lib/motion/shotcraft/upstream/assets/lib/helpers/camera.tsx +75 -75
  36. package/lib/motion/shotcraft/upstream/assets/lib/helpers/motion.ts +40 -40
  37. package/lib/motion/shotcraft/upstream/assets/lib/helpers/rand.ts +11 -11
  38. package/lib/motion/shotcraft/upstream/assets/lib/helpers/shake.ts +10 -10
  39. package/lib/motion/shotcraft/upstream/assets/scripts/build-readme-cover.mjs +49 -49
  40. package/lib/motion/shotcraft/upstream/assets/scripts/capture-template.mjs +210 -210
  41. package/lib/motion/shotcraft/upstream/assets/scripts/sfx-source.py +423 -423
  42. package/lib/motion/shotcraft/upstream/assets/scripts/smoke-render-demos.py +170 -170
  43. package/lib/motion/shotcraft/upstream/assets/scripts/test_sfx_source.py +157 -157
  44. package/lib/motion/shotcraft/upstream/demos/README.md +120 -120
  45. package/lib/motion/shotcraft/upstream/demos/_fixtures/Brand.tsx +112 -112
  46. package/lib/motion/shotcraft/upstream/demos/_fixtures/Fixtures.tsx +647 -647
  47. package/lib/motion/shotcraft/upstream/demos/_fixtures/Look.tsx +316 -316
  48. package/lib/motion/shotcraft/upstream/demos/_fixtures/Motion.tsx +82 -82
  49. package/lib/motion/shotcraft/upstream/demos/_fixtures/PageCam2D.tsx +115 -115
  50. package/lib/motion/shotcraft/upstream/demos/_fixtures/Polish.tsx +243 -243
  51. package/lib/motion/shotcraft/upstream/demos/_textures/live-layout.json +388 -388
  52. package/lib/motion/shotcraft/upstream/demos/camera/basic-3d-scene/Basic3DScene.tsx +250 -250
  53. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashImpactReal.tsx +305 -305
  54. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashZoomReal.tsx +246 -246
  55. package/lib/motion/shotcraft/upstream/demos/camera/cursor-flyover/CursorFlyover.tsx +390 -390
  56. package/lib/motion/shotcraft/upstream/demos/camera/depth-layer-moves/MultiplaneReal.tsx +138 -138
  57. package/lib/motion/shotcraft/upstream/demos/camera/graze-face-tour/GrazeFaceTour.tsx +542 -542
  58. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/OverheadTabletopDrop.tsx +315 -315
  59. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/TiltReveal.tsx +299 -299
  60. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/DroneDiveLanding.tsx +173 -173
  61. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/ExplodedView.tsx +348 -348
  62. package/lib/motion/shotcraft/upstream/demos/camera/steep-tilt-glide/SteepTiltGlide.tsx +366 -366
  63. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx +279 -279
  64. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/PullBackIsolation.tsx +184 -184
  65. package/lib/motion/shotcraft/upstream/demos/camera/terminal-3d/Terminal3D.tsx +390 -390
  66. package/lib/motion/shotcraft/upstream/demos/data/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +155 -155
  67. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/AxisRescaleShockV2.tsx +303 -303
  68. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/OscilloscopeStreamV2.tsx +290 -290
  69. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/UnitDotSwarmRegroupV2.tsx +278 -278
  70. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/NeedleSweepSelftest.tsx +307 -307
  71. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/TapeScrollFixedPointer.tsx +215 -215
  72. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/BrakeReticleLock.tsx +299 -299
  73. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/ChangelogScrollBrake.tsx +232 -232
  74. package/lib/motion/shotcraft/upstream/demos/data/timeline-travel/TimelineTravel.tsx +290 -290
  75. package/lib/motion/shotcraft/upstream/demos/effects/assemble-then-type-flyin/AssembleThenTypeFlyin.tsx +273 -273
  76. package/lib/motion/shotcraft/upstream/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx +167 -167
  77. package/lib/motion/shotcraft/upstream/demos/effects/brand-frame-snap/BrandFrameSnap.tsx +536 -536
  78. package/lib/motion/shotcraft/upstream/demos/effects/fui-hud-moves/ReticleLockOn.tsx +164 -164
  79. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/FlylineArc.tsx +175 -175
  80. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/GlowOrbAmbient.tsx +197 -197
  81. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/OrbFlylineRelay.tsx +241 -241
  82. package/lib/motion/shotcraft/upstream/demos/effects/icon-performance-moves/AttentionBounce.tsx +279 -279
  83. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/AnimeImpact.tsx +230 -230
  84. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/HitCounter.tsx +345 -345
  85. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SheenSweepRetry.tsx +275 -275
  86. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SpotlightSweepReveal.tsx +229 -229
  87. package/lib/motion/shotcraft/upstream/demos/effects/radial-ripple-phone-chips/RadialRipplePhoneChips.tsx +312 -312
  88. package/lib/motion/shotcraft/upstream/demos/effects/riso-print-hits/RisoMisregistrationHit.tsx +222 -222
  89. package/lib/motion/shotcraft/upstream/demos/effects/scan-bracket-sweep/ScanBracketSweep.tsx +295 -295
  90. package/lib/motion/shotcraft/upstream/demos/effects/scanline-annotate-focus/ScanlineAnnotateFocus.tsx +329 -329
  91. package/lib/motion/shotcraft/upstream/demos/effects/scanline-assemble-flyin/ScanlineAssembleFlyin.tsx +315 -315
  92. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ImpactBurstKit.tsx +264 -264
  93. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/KanadaPerspectiveSnap.tsx +260 -260
  94. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ScoreSlam.tsx +263 -263
  95. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/CornerSpotlightReveal.tsx +123 -123
  96. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +187 -187
  97. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/SlideSpotlightPan.tsx +175 -175
  98. package/lib/motion/shotcraft/upstream/demos/interaction/autolayout-gap-dial/AutolayoutGapDial.tsx +305 -305
  99. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/DiagramCascadeBuild.tsx +350 -350
  100. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +352 -352
  101. package/lib/motion/shotcraft/upstream/demos/interaction/chip-grid-single-select-blackout/ChipGridSingleSelectBlackout.tsx +218 -218
  102. package/lib/motion/shotcraft/upstream/demos/interaction/collab-cursor-moves/CursorCastEnsemble.tsx +297 -297
  103. package/lib/motion/shotcraft/upstream/demos/interaction/glass-pill-dictation-typing/GlassPillDictationTyping.tsx +157 -157
  104. package/lib/motion/shotcraft/upstream/demos/interaction/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +218 -218
  105. package/lib/motion/shotcraft/upstream/demos/interaction/picker-carousel-feature-cycle/PickerCarouselFeatureCycle.tsx +202 -202
  106. package/lib/motion/shotcraft/upstream/demos/interaction/segmented-thumb-hero/SegmentedThumbHero.tsx +265 -265
  107. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/PaletteThemeRipple.tsx +457 -457
  108. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/ThemeSweepToggle.tsx +446 -446
  109. package/lib/motion/shotcraft/upstream/demos/interaction/type-and-filter/TypeAndFilter.tsx +249 -249
  110. package/lib/motion/shotcraft/upstream/demos/interaction/voice-waveform-live/VoiceWaveformLive.tsx +278 -278
  111. package/lib/motion/shotcraft/upstream/demos/opening/crane-rise-reveal/CraneRiseReveal.tsx +332 -332
  112. package/lib/motion/shotcraft/upstream/demos/opening/dataviz-landscape-open/DatavizLandscapeOpen.tsx +358 -358
  113. package/lib/motion/shotcraft/upstream/demos/opening/fracture/Fracture.tsx +201 -201
  114. package/lib/motion/shotcraft/upstream/demos/opening/icon-field-colorize/IconFieldColorize.tsx +200 -200
  115. package/lib/motion/shotcraft/upstream/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx +208 -208
  116. package/lib/motion/shotcraft/upstream/demos/opening/magician-card-flourish/MagicianCardFlourish.tsx +341 -341
  117. package/lib/motion/shotcraft/upstream/demos/opening/orbit-ring-title-open/OrbitRingTitleOpen.tsx +389 -389
  118. package/lib/motion/shotcraft/upstream/demos/opening/spotlight-hero-card/SpotlightHeroCard.tsx +293 -293
  119. package/lib/motion/shotcraft/upstream/demos/opening/stroke-segment-build/StrokeSegmentBuild.tsx +183 -183
  120. package/lib/motion/shotcraft/upstream/demos/opening/text-as-mask/TextAsMask.tsx +245 -245
  121. package/lib/motion/shotcraft/upstream/demos/outro/grain-dissolve/GrainDissolve.tsx +222 -222
  122. package/lib/motion/shotcraft/upstream/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx +223 -223
  123. package/lib/motion/shotcraft/upstream/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx +217 -217
  124. package/lib/motion/shotcraft/upstream/demos/outro/outro-group-photo-launch/OutroGroupPhotoLaunch.tsx +343 -343
  125. package/lib/motion/shotcraft/upstream/demos/outro/ui-strip-away-outro/UiStripAwayOutro.tsx +357 -357
  126. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/IconFlipBloomLogo.tsx +187 -187
  127. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/InputMorphsIntoLogo.tsx +333 -333
  128. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-cut-moves/PaparazziFlash.tsx +274 -274
  129. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +270 -270
  130. package/lib/motion/shotcraft/upstream/demos/rhythm/panel-grid-moves/ComicPanelSplit.tsx +430 -430
  131. package/lib/motion/shotcraft/upstream/demos/rhythm/quad-split-parallel-scenes/QuadSplitParallelScenes.tsx +252 -252
  132. package/lib/motion/shotcraft/upstream/demos/rhythm/rhythm-interrupt-moves/JumpCutPunchIn.tsx +106 -106
  133. package/lib/motion/shotcraft/upstream/demos/rhythm/sakuga-timing-shift/SakugaTimingShift.tsx +288 -288
  134. package/lib/motion/shotcraft/upstream/demos/rhythm/speed-ramp-freeze/FreezeAnnotateReal.tsx +362 -362
  135. package/lib/motion/shotcraft/upstream/demos/rhythm/trailer-grammar-moves/TrailerBumper.tsx +168 -168
  136. package/lib/motion/shotcraft/upstream/demos/transition/bottom-push-stack-wipe/BottomPushStackWipe.tsx +310 -310
  137. package/lib/motion/shotcraft/upstream/demos/transition/card-flip-reveal/CardFlipReveal.tsx +261 -261
  138. package/lib/motion/shotcraft/upstream/demos/transition/card-flock-tumble/CardFlockTumble.tsx +459 -459
  139. package/lib/motion/shotcraft/upstream/demos/transition/circle-match-iris/CircleMatchIris.tsx +294 -294
  140. package/lib/motion/shotcraft/upstream/demos/transition/gradient-transition/GradientTransition.tsx +161 -161
  141. package/lib/motion/shotcraft/upstream/demos/transition/line-carry-transition/LineCarryTransition.tsx +248 -248
  142. package/lib/motion/shotcraft/upstream/demos/transition/mosaic-reframe/MosaicReframe.tsx +359 -359
  143. package/lib/motion/shotcraft/upstream/demos/transition/page-turn-transitions/BarnDoorSplit.tsx +227 -227
  144. package/lib/motion/shotcraft/upstream/demos/transition/print-texture-transitions/InkBleedReveal.tsx +162 -162
  145. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/PortalWipeV2.tsx +248 -248
  146. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/WhipBrakeReal.tsx +186 -186
  147. package/lib/motion/shotcraft/upstream/demos/transition/tear-streak-transitions/GlitchDisplace.tsx +355 -355
  148. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/InvisibleCut.tsx +272 -272
  149. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/LightLeakBurn.tsx +262 -262
  150. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/VersusSlam.tsx +217 -217
  151. package/lib/motion/shotcraft/upstream/demos/transition/transition-travel/LetterformZoom.tsx +285 -285
  152. package/lib/motion/shotcraft/upstream/demos/transition/white-flash-logo-simplify-cut/WhiteFlashLogoSimplifyCut.tsx +205 -205
  153. package/lib/motion/shotcraft/upstream/demos/transition/wipe-transitions/BlindsSlice.tsx +178 -178
  154. package/lib/motion/shotcraft/upstream/demos/typography/blur-slide/BlurSlide.tsx +147 -147
  155. package/lib/motion/shotcraft/upstream/demos/typography/brace-expand/BraceExpand.tsx +143 -143
  156. package/lib/motion/shotcraft/upstream/demos/typography/brand-ink-open/BrandInkOpen.tsx +134 -134
  157. package/lib/motion/shotcraft/upstream/demos/typography/countdown-arc-scatter/CountdownArcScatter.tsx +217 -217
  158. package/lib/motion/shotcraft/upstream/demos/typography/flying-words/FlyingWords.tsx +198 -198
  159. package/lib/motion/shotcraft/upstream/demos/typography/glitch-cycle/GlitchCycle.tsx +221 -221
  160. package/lib/motion/shotcraft/upstream/demos/typography/gradient-word-sweep/GradientWordSweep.tsx +312 -312
  161. package/lib/motion/shotcraft/upstream/demos/typography/lead-word-zoom-assemble/LeadWordZoomAssemble.tsx +261 -261
  162. package/lib/motion/shotcraft/upstream/demos/typography/marker-underline-title/MarkerUnderlineTitle.tsx +121 -121
  163. package/lib/motion/shotcraft/upstream/demos/typography/outline-word-fill/OutlineWordFill.tsx +153 -153
  164. package/lib/motion/shotcraft/upstream/demos/typography/paper-title-card/PaperTitleCard.tsx +179 -179
  165. package/lib/motion/shotcraft/upstream/demos/typography/pill-chip-slot-cycle-handled/PillChipSlotCycleHandled.tsx +140 -140
  166. package/lib/motion/shotcraft/upstream/demos/typography/pill-slot-cycle/PillSlotCycle.tsx +309 -309
  167. package/lib/motion/shotcraft/upstream/demos/typography/text-column-converge/TextColumnConverge.tsx +191 -191
  168. package/lib/motion/shotcraft/upstream/demos/typography/title-demote-to-label/TitleDemoteToLabel.tsx +292 -292
  169. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/LetterformDriftAssembly.tsx +135 -135
  170. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/SplitTextStagger.tsx +124 -124
  171. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/TextOnPath.tsx +255 -255
  172. package/lib/motion/shotcraft/upstream/demos/typography/type-entrance-moves/LetterDropPhysics.tsx +173 -173
  173. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/FontWeightPump.tsx +225 -225
  174. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/KaraokeFillSync.tsx +141 -141
  175. package/lib/motion/shotcraft/upstream/demos/typography/typewriter-moves/TypewriterErrorRetype.tsx +137 -137
  176. package/lib/motion/shotcraft/upstream/demos/typography/vertical-word-roll-blur-cycle/VerticalWordRollBlurCycle.tsx +147 -147
  177. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-filmstrip/WordRelayFilmstrip.tsx +409 -409
  178. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-geometry/WordRelayGeometry.tsx +280 -280
  179. package/lib/motion/shotcraft/upstream/demos/ui-entrance/avatar-bracket-carousel/AvatarBracketCarousel.tsx +271 -271
  180. package/lib/motion/shotcraft/upstream/demos/ui-entrance/bezier-source-converge-merge/BezierSourceConvergeMerge.tsx +385 -385
  181. package/lib/motion/shotcraft/upstream/demos/ui-entrance/card-stack/CardStack.tsx +312 -312
  182. package/lib/motion/shotcraft/upstream/demos/ui-entrance/carousel-3d/Carousel3D.tsx +303 -303
  183. package/lib/motion/shotcraft/upstream/demos/ui-entrance/clipcard-looping/ClipCardLooping.tsx +77 -77
  184. package/lib/motion/shotcraft/upstream/demos/ui-entrance/cloner-depth-echo/ClonerDepthEcho.tsx +311 -311
  185. package/lib/motion/shotcraft/upstream/demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx +307 -307
  186. package/lib/motion/shotcraft/upstream/demos/ui-entrance/doc-park-left-pill-deal/DocParkLeftPillDeal.tsx +349 -349
  187. package/lib/motion/shotcraft/upstream/demos/ui-entrance/document-typewriter-reveal/DocumentTypewriterReveal.tsx +255 -255
  188. package/lib/motion/shotcraft/upstream/demos/ui-entrance/draw-svg-trace/DrawSvgTrace.tsx +244 -244
  189. package/lib/motion/shotcraft/upstream/demos/ui-entrance/element-body-moves/ContactShadowLift.tsx +217 -217
  190. package/lib/motion/shotcraft/upstream/demos/ui-entrance/integration-hub-map/IntegrationHubMap.tsx +652 -652
  191. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-reveal/ListReveal.tsx +153 -153
  192. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-stack-press/ListStackPress.tsx +238 -238
  193. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-forerun/NeonFrameForerun.tsx +324 -324
  194. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +354 -354
  195. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/PageWaterfallWall.tsx +101 -101
  196. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/VerticalTicker.tsx +129 -129
  197. package/lib/motion/shotcraft/upstream/demos/ui-entrance/product-card-progressive-assemble/ProductCardProgressiveAssemble.tsx +297 -297
  198. package/lib/motion/shotcraft/upstream/demos/ui-entrance/radial-wave/RadialWave.tsx +57 -57
  199. package/lib/motion/shotcraft/upstream/demos/ui-entrance/research-card-stack-scroll/ResearchCardStackScroll.tsx +155 -155
  200. package/lib/motion/shotcraft/upstream/demos/ui-entrance/row-embed/RowEmbed.tsx +175 -175
  201. package/lib/motion/shotcraft/upstream/demos/ui-entrance/value-stagger-gradient/ValueStaggerGradient.tsx +153 -153
  202. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/BentoLightUp.tsx +146 -146
  203. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/WireframeDrawOn.tsx +226 -226
  204. package/lib/motion/shotcraft/upstream/gallery/api/library.json +1 -1
  205. package/lib/motion/shotcraft/upstream/references/aesthetic-rules.md +193 -193
  206. package/lib/motion/shotcraft/upstream/references/final-review.md +121 -121
  207. package/lib/motion/shotcraft/upstream/references/guided-free-creation.md +199 -199
  208. package/lib/motion/shotcraft/upstream/references/jianying-export.md +183 -183
  209. package/lib/motion/shotcraft/upstream/references/music-beat-sync.md +257 -257
  210. package/lib/motion/shotcraft/upstream/references/pipeline.md +382 -382
  211. package/lib/motion/shotcraft/upstream/references/publish-upload-post.md +111 -111
  212. package/lib/motion/shotcraft/upstream/references/sequences/promo-energy-arc.md +50 -50
  213. package/lib/motion/shotcraft/upstream/references/sfx-sourcing.md +95 -95
  214. package/lib/motion/shotcraft/upstream/references/shots/camera/basic-3d-scene.md +41 -41
  215. package/lib/motion/shotcraft/upstream/references/shots/camera/crash-zoom-punch.md +52 -52
  216. package/lib/motion/shotcraft/upstream/references/shots/camera/cursor-flyover.md +39 -39
  217. package/lib/motion/shotcraft/upstream/references/shots/camera/depth-layer-moves.md +39 -39
  218. package/lib/motion/shotcraft/upstream/references/shots/camera/graze-face-tour.md +57 -57
  219. package/lib/motion/shotcraft/upstream/references/shots/camera/overhead-camera-moves.md +51 -51
  220. package/lib/motion/shotcraft/upstream/references/shots/camera/space-camera-moves.md +46 -46
  221. package/lib/motion/shotcraft/upstream/references/shots/camera/steep-tilt-glide.md +52 -52
  222. package/lib/motion/shotcraft/upstream/references/shots/camera/tension-camera-moves.md +43 -43
  223. package/lib/motion/shotcraft/upstream/references/shots/camera/terminal-3d.md +42 -42
  224. package/lib/motion/shotcraft/upstream/references/shots/data/before-after-slider-scrub.md +48 -48
  225. package/lib/motion/shotcraft/upstream/references/shots/data/chart-live-moves.md +52 -52
  226. package/lib/motion/shotcraft/upstream/references/shots/data/gauge-readout-moves.md +45 -45
  227. package/lib/motion/shotcraft/upstream/references/shots/data/scroll-brake-moves.md +46 -46
  228. package/lib/motion/shotcraft/upstream/references/shots/data/timeline-travel.md +44 -44
  229. package/lib/motion/shotcraft/upstream/references/shots/effects/assemble-then-type-flyin.md +63 -63
  230. package/lib/motion/shotcraft/upstream/references/shots/effects/aurora-bloom-bg-flip.md +54 -54
  231. package/lib/motion/shotcraft/upstream/references/shots/effects/brand-frame-snap.md +58 -58
  232. package/lib/motion/shotcraft/upstream/references/shots/effects/fui-hud-moves.md +35 -35
  233. package/lib/motion/shotcraft/upstream/references/shots/effects/glow-flyline-moves.md +53 -53
  234. package/lib/motion/shotcraft/upstream/references/shots/effects/icon-performance-moves.md +42 -42
  235. package/lib/motion/shotcraft/upstream/references/shots/effects/impact-feedback.md +50 -50
  236. package/lib/motion/shotcraft/upstream/references/shots/effects/light-play-moves.md +46 -46
  237. package/lib/motion/shotcraft/upstream/references/shots/effects/radial-ripple-phone-chips.md +56 -56
  238. package/lib/motion/shotcraft/upstream/references/shots/effects/riso-print-hits.md +49 -49
  239. package/lib/motion/shotcraft/upstream/references/shots/effects/scan-bracket-sweep.md +50 -50
  240. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-annotate-focus.md +53 -53
  241. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-assemble-flyin.md +53 -53
  242. package/lib/motion/shotcraft/upstream/references/shots/effects/slam-entrance-moves.md +55 -55
  243. package/lib/motion/shotcraft/upstream/references/shots/effects/spotlight-sweep-moves.md +52 -52
  244. package/lib/motion/shotcraft/upstream/references/shots/interaction/autolayout-gap-dial.md +60 -60
  245. package/lib/motion/shotcraft/upstream/references/shots/interaction/canvas-materialize-moves.md +57 -57
  246. package/lib/motion/shotcraft/upstream/references/shots/interaction/chip-grid-single-select-blackout.md +51 -51
  247. package/lib/motion/shotcraft/upstream/references/shots/interaction/collab-cursor-moves.md +41 -41
  248. package/lib/motion/shotcraft/upstream/references/shots/interaction/glass-pill-dictation-typing.md +53 -53
  249. package/lib/motion/shotcraft/upstream/references/shots/interaction/hashtag-to-pill-materialize.md +60 -60
  250. package/lib/motion/shotcraft/upstream/references/shots/interaction/picker-carousel-feature-cycle.md +55 -55
  251. package/lib/motion/shotcraft/upstream/references/shots/interaction/segmented-thumb-hero.md +57 -57
  252. package/lib/motion/shotcraft/upstream/references/shots/interaction/theme-switch-moves.md +47 -47
  253. package/lib/motion/shotcraft/upstream/references/shots/interaction/type-and-filter.md +37 -37
  254. package/lib/motion/shotcraft/upstream/references/shots/interaction/voice-waveform-live.md +54 -54
  255. package/lib/motion/shotcraft/upstream/references/shots/opening/brand-ink-open.md +36 -36
  256. package/lib/motion/shotcraft/upstream/references/shots/opening/crane-rise-reveal.md +56 -56
  257. package/lib/motion/shotcraft/upstream/references/shots/opening/dataviz-landscape-open.md +56 -56
  258. package/lib/motion/shotcraft/upstream/references/shots/opening/fracture.md +40 -40
  259. package/lib/motion/shotcraft/upstream/references/shots/opening/icon-field-colorize.md +60 -60
  260. package/lib/motion/shotcraft/upstream/references/shots/opening/letterspace-materialize.md +57 -57
  261. package/lib/motion/shotcraft/upstream/references/shots/opening/magician-card-flourish.md +73 -73
  262. package/lib/motion/shotcraft/upstream/references/shots/opening/orbit-ring-title-open.md +87 -87
  263. package/lib/motion/shotcraft/upstream/references/shots/opening/spotlight-hero-card.md +55 -55
  264. package/lib/motion/shotcraft/upstream/references/shots/opening/stroke-segment-build.md +50 -50
  265. package/lib/motion/shotcraft/upstream/references/shots/opening/text-as-mask.md +59 -59
  266. package/lib/motion/shotcraft/upstream/references/shots/outro/grain-dissolve.md +38 -38
  267. package/lib/motion/shotcraft/upstream/references/shots/outro/logo-shrink-wordmark-lockup.md +38 -38
  268. package/lib/motion/shotcraft/upstream/references/shots/outro/neon-triple-marquee.md +59 -59
  269. package/lib/motion/shotcraft/upstream/references/shots/outro/outro-group-photo-launch.md +39 -39
  270. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-strip-away-outro.md +61 -61
  271. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-to-brand-morph.md +52 -52
  272. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-cut-moves.md +50 -50
  273. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-step-list-theme-cycle.md +66 -66
  274. package/lib/motion/shotcraft/upstream/references/shots/rhythm/panel-grid-moves.md +43 -43
  275. package/lib/motion/shotcraft/upstream/references/shots/rhythm/quad-split-parallel-scenes.md +38 -38
  276. package/lib/motion/shotcraft/upstream/references/shots/rhythm/rhythm-interrupt-moves.md +38 -38
  277. package/lib/motion/shotcraft/upstream/references/shots/rhythm/sakuga-timing-shift.md +56 -56
  278. package/lib/motion/shotcraft/upstream/references/shots/rhythm/speed-ramp-freeze.md +44 -44
  279. package/lib/motion/shotcraft/upstream/references/shots/rhythm/trailer-grammar-moves.md +38 -38
  280. package/lib/motion/shotcraft/upstream/references/shots/transition/bottom-push-stack-wipe.md +63 -63
  281. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flip-reveal.md +57 -57
  282. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flock-tumble.md +63 -63
  283. package/lib/motion/shotcraft/upstream/references/shots/transition/circle-match-iris.md +58 -58
  284. package/lib/motion/shotcraft/upstream/references/shots/transition/gradient-transition.md +45 -45
  285. package/lib/motion/shotcraft/upstream/references/shots/transition/line-carry-transition.md +55 -55
  286. package/lib/motion/shotcraft/upstream/references/shots/transition/mosaic-reframe.md +49 -49
  287. package/lib/motion/shotcraft/upstream/references/shots/transition/page-turn-transitions.md +42 -42
  288. package/lib/motion/shotcraft/upstream/references/shots/transition/print-texture-transitions.md +42 -42
  289. package/lib/motion/shotcraft/upstream/references/shots/transition/shot-transitions.md +45 -45
  290. package/lib/motion/shotcraft/upstream/references/shots/transition/tear-streak-transitions.md +48 -48
  291. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-hidden-cut.md +55 -55
  292. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-travel.md +43 -43
  293. package/lib/motion/shotcraft/upstream/references/shots/transition/white-flash-logo-simplify-cut.md +41 -41
  294. package/lib/motion/shotcraft/upstream/references/shots/transition/wipe-transitions.md +42 -42
  295. package/lib/motion/shotcraft/upstream/references/shots/typography/blur-slide.md +59 -59
  296. package/lib/motion/shotcraft/upstream/references/shots/typography/brace-expand.md +55 -55
  297. package/lib/motion/shotcraft/upstream/references/shots/typography/countdown-arc-scatter.md +65 -65
  298. package/lib/motion/shotcraft/upstream/references/shots/typography/document-typewriter-reveal.md +42 -42
  299. package/lib/motion/shotcraft/upstream/references/shots/typography/flying-words.md +64 -64
  300. package/lib/motion/shotcraft/upstream/references/shots/typography/glitch-cycle.md +64 -64
  301. package/lib/motion/shotcraft/upstream/references/shots/typography/gradient-word-sweep.md +54 -54
  302. package/lib/motion/shotcraft/upstream/references/shots/typography/lead-word-zoom-assemble.md +91 -91
  303. package/lib/motion/shotcraft/upstream/references/shots/typography/marker-underline-title.md +51 -51
  304. package/lib/motion/shotcraft/upstream/references/shots/typography/outline-word-fill.md +66 -66
  305. package/lib/motion/shotcraft/upstream/references/shots/typography/paper-title-card.md +38 -38
  306. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-chip-slot-cycle-handled.md +66 -66
  307. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-slot-cycle.md +58 -58
  308. package/lib/motion/shotcraft/upstream/references/shots/typography/text-column-converge.md +61 -61
  309. package/lib/motion/shotcraft/upstream/references/shots/typography/title-demote-to-label.md +64 -64
  310. package/lib/motion/shotcraft/upstream/references/shots/typography/type-assembly-moves.md +45 -45
  311. package/lib/motion/shotcraft/upstream/references/shots/typography/type-entrance-moves.md +41 -41
  312. package/lib/motion/shotcraft/upstream/references/shots/typography/type-rhythm-sync.md +51 -51
  313. package/lib/motion/shotcraft/upstream/references/shots/typography/typewriter-moves.md +42 -42
  314. package/lib/motion/shotcraft/upstream/references/shots/typography/vertical-word-roll-blur-cycle.md +63 -63
  315. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-filmstrip.md +57 -57
  316. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-geometry.md +75 -75
  317. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/avatar-bracket-carousel.md +59 -59
  318. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/bezier-source-converge-merge.md +67 -67
  319. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/card-stack.md +60 -60
  320. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/carousel-3d.md +66 -66
  321. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/cloner-depth-echo.md +40 -40
  322. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/deck-deal-flyin.md +45 -45
  323. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/doc-park-left-pill-deal.md +62 -62
  324. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/draw-svg-trace.md +55 -55
  325. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/element-body-moves.md +37 -37
  326. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/integration-hub-map.md +55 -55
  327. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-reveal.md +50 -50
  328. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-stack-press.md +43 -43
  329. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-forerun.md +55 -55
  330. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-orbit-drop.md +51 -51
  331. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/page-waterfall-wall.md +51 -51
  332. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/product-card-progressive-assemble.md +56 -56
  333. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/radial-wave.md +49 -49
  334. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/research-card-stack-scroll.md +57 -57
  335. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/row-embed.md +36 -36
  336. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/value-stagger-gradient.md +64 -64
  337. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/wall-reveal-moves.md +47 -47
  338. package/lib/motion/shotcraft/upstream/references/sound-design.md +170 -170
  339. package/lib/motion/shotcraft/upstream/references/workbench.md +157 -157
  340. package/lib/motion/shotcraft/upstream/template/TEMPLATE.md +103 -103
  341. package/lib/motion/shotcraft/upstream/template/THEMES.md +44 -44
  342. package/lib/motion/shotcraft/upstream/template/package.json +20 -20
  343. package/lib/motion/shotcraft/upstream/template/remotion.config.ts +6 -6
  344. package/lib/motion/shotcraft/upstream/template/src/Root.tsx +17 -17
  345. package/lib/motion/shotcraft/upstream/template/src/aifl/Caption.tsx +65 -65
  346. package/lib/motion/shotcraft/upstream/template/src/aifl/DigitRoll.tsx +48 -48
  347. package/lib/motion/shotcraft/upstream/template/src/aifl/FlashCut.tsx +24 -24
  348. package/lib/motion/shotcraft/upstream/template/src/aifl/Main.tsx +192 -192
  349. package/lib/motion/shotcraft/upstream/template/src/aifl/PaperTitleCard.tsx +111 -111
  350. package/lib/motion/shotcraft/upstream/template/src/aifl/live/PageCam.tsx +150 -150
  351. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneDetail.tsx +158 -158
  352. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneFlyIn.tsx +468 -468
  353. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOpen.tsx +552 -552
  354. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOutroLive.tsx +411 -411
  355. package/lib/motion/shotcraft/upstream/template/src/aifl/live/ScenePapers.tsx +200 -200
  356. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneWbr.tsx +324 -324
  357. package/lib/motion/shotcraft/upstream/template/src/aifl/live-layout.json +388 -388
  358. package/lib/motion/shotcraft/upstream/template/src/index.ts +4 -4
  359. package/lib/motion/shotcraft/upstream/template/src/themes/ThemedFilm.tsx +7 -7
  360. package/lib/motion/shotcraft/upstream/template/src/themes/manifest.tsx +68 -68
  361. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.json +1 -1
  362. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.ts +24 -24
  363. package/lib/motion/shotcraft/upstream/template/src/themes/palettes.json +74 -74
  364. package/lib/motion/shotcraft/upstream/template/src/themes/visual-theme.tsx +91 -91
  365. package/lib/motion/shotcraft/upstream/template/src/workbench.ts +213 -213
  366. package/lib/motion/shotcraft/upstream/template/tsconfig.json +15 -15
  367. package/lib/motion/style-frames.js +306 -306
  368. package/lib/motion/sync.js +214 -214
  369. package/lib/motion-library.js +1 -1
  370. package/lib/motion-project.js +105 -105
  371. package/lib/motion-render-worker.js +174 -174
  372. package/lib/routing/router.js +222 -222
  373. package/lib/routing/vendor/README.md +96 -96
  374. package/lib/routing/vendor/libavoid-routing.js +753 -753
  375. package/lib/routing/vendor/libavoid.min.js +59 -59
  376. package/lib/svg-export.js +1344 -0
  377. package/lib/video-trace-pool.js +128 -128
  378. package/package.json +3 -2
  379. package/LICENSE +0 -4175
@@ -1,299 +1,299 @@
1
- // tilt-reveal|俯仰揭示(第二轮重设计)
2
- // 手法不变:整页 rotateX 平躺、开场只见上缘一条透视窄带,机位"抬头"回正,内容一排排涌入视野。
3
- //
4
- // 设计决定
5
- // - look:midnight(深蓝夜 · 电光蓝)。开场是黑夜里的一道"地平线"——平躺页面的远端上缘只剩一条
6
- // 发光的窄带(远端上沿一道白蓝亮线 + 宽幅蓝色泛光),像天际线上的第一道光。
7
- // - 主体:为镜头设计的 video-shotcraft 暗场渲染看板——顶栏(品牌标志 + 字标)、120px 大标题「Renders are up 38%」、
8
- // 一张横贯全宽的发光面积图、三块 76px 大数字 KPI。元素少、字大、对比强,落定就是一张海报。
9
- // 页面落定在画面里留边(0.84 倍),四周能看到舞台光,脚下有一片蓝色光晕"地面反光"。
10
- // - 运镜:页面绕下沿铰链、正面朝上平躺(视点在页面上方,窄带里的字是正的),rotateX 86°→−2.2° 过冲→0° 抬正,
11
- // 同一条进度 p 驱动缩放 2.5→0.84、铰链位置、视点高度、透视距离;背景光池与浮尘按俯仰反向视差下移——读作"相机抬头",而不是页面在转。
12
- // - 光:抬升过程中一道镜面反光带从页面上沿扫到下沿(掠射角变化的物理反光,Q4:主角一次、
13
- // 裁进圆角);面积图的发光折线在抬升后半程描出,落定时终点亮起一颗光点。
14
- // - Q2:放大不走 transform scale,按目标倍率布局 + CSS zoom 栅格化,再用等效 rotateX'·scaleY 还原透视;
15
- // 平躺时按纵向压缩比做只竖向的抗锯齿预模糊,读得清之前自动关掉。
16
- //
17
- // 时间表(30fps,共 120f)
18
- // 0–20 预备:窄带已在画面(第 1 帧就有那道光),极缓 creep 86°→83°,背光由暗到亮
19
- // 20–60 抬头 40f:不对称 in-out(起步柔、中段快、末端零速),冲到 −2.2° 过冲顶点;
20
- // 最快的几帧给竖向运动模糊;32–62 镜面反光带扫过页面
21
- // 60–70 软回 0°(smooth)——机位落定
22
- // 38–82 面积图折线描出(out,带一颗发光笔头),80f 终点光点亮起;KPI 三格错峰上浮提亮(行比底板晚一拍)
23
- // 70–120 hold 50f:极缓推近 1→1.018、背光呼吸,尾帧是完整海报
24
- import React from 'react';
25
- import { AbsoluteFill, useCurrentFrame } from 'remotion';
26
- import { Dust, LOOKS, Stage, alpha, type } from '../../_fixtures/Look';
27
- import { EASE, FONT, SpeedBlur, mix, ramp } from '../../_fixtures/Polish';
28
- import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
29
-
30
- export const TILT_REVEAL_DURATION = 120;
31
-
32
- const L = LOOKS.midnight;
33
-
34
- const HOLD = 20; // 预备 creep 结束
35
- const MOVE = 40; // 主抬升 20→60
36
- const SETTLE = 10; // 过冲回落 60→70
37
- const FROM = 86; // 平躺俯角(页面绕下沿铰链向远处躺倒,正面朝上)
38
- const CREEP = 3 / 86; // 预备段先抬 3°
39
- const OVER = 1 + 2.2 / 86; // 主抬升冲过 0° 到 +2.2°
40
- const S0 = 2.5; // 平躺时的放大倍率(窄带够宽、够近)
41
- const S1 = 0.84; // 落定倍率:页面四周留出舞台
42
- const BOT0 = 600; // 平躺时铰链(页面下沿)的屏幕 y——窄带落在画面中线附近
43
- const BOT1 = 540 + (1080 * S1) / 2 - 18; // 落定时页面下沿(略偏上,给脚下反光留位)
44
- const PAGE_R = 26; // 页面圆角(1x 页面 px)
45
-
46
- // 时间 → 姿态(纯函数;速度用中心差分求)。角度走带过冲的 q,缩放/位移/透视走不过冲的 p
47
- const poseAt = (f: number) => {
48
- const creep = ramp(f, 0, HOLD, EASE.smooth) * CREEP;
49
- const lift = ramp(f, HOLD, MOVE, EASE.swift);
50
- const q = mix(creep, OVER, lift) - (OVER - 1) * ramp(f, HOLD + MOVE, SETTLE, EASE.smooth);
51
- const p = mix(creep, 1, lift);
52
- return {
53
- p,
54
- rotX: FROM * (1 - q),
55
- scale: mix(S0, S1, p),
56
- bot: mix(BOT0, BOT1, p),
57
- eye: mix(BOT0 - 300, 520, p), // 视点高度:平躺时在页面上方(俯视看到正面),落定时回到画面中心
58
- persp: mix(700, 1500, p),
59
- };
60
- };
61
-
62
- // ───────────── 页面:video-shotcraft 暗场渲染看板(1920×1080 设计坐标) ─────────────
63
-
64
- // 面积图数据(确定性):缓升 + 两次回落 + 末段冲高
65
- const SERIES = [22, 26, 24, 31, 35, 33, 38, 44, 41, 47, 52, 49, 55, 61, 58, 66, 71, 69, 78, 86];
66
- const CH = { x: 0, y: 0, w: 1600, h: 300 };
67
- const pt = (i: number) => {
68
- const x = CH.x + (i / (SERIES.length - 1)) * CH.w;
69
- const y = CH.y + CH.h - (SERIES[i] / 100) * CH.h;
70
- return [x, y] as const;
71
- };
72
- // Catmull-Rom → 三次贝塞尔,平滑折线
73
- const linePath = (() => {
74
- let d = '';
75
- for (let i = 0; i < SERIES.length; i++) {
76
- const [x, y] = pt(i);
77
- if (i === 0) { d += `M${x},${y}`; continue; }
78
- const [x0, y0] = pt(Math.max(0, i - 2));
79
- const [x1, y1] = pt(i - 1);
80
- const [x3, y3] = pt(Math.min(SERIES.length - 1, i + 1));
81
- d += ` C${x1 + (x - x0) / 6},${y1 + (y - y0) / 6} ${x - (x3 - x1) / 6},${y - (y3 - y1) / 6} ${x},${y}`;
82
- }
83
- return d;
84
- })();
85
- const areaPath = `${linePath} L${CH.w},${CH.h} L0,${CH.h} Z`;
86
-
87
- const KPIS = [
88
- { k: 'Frames rendered', v: '4.82M', d: '+38%' },
89
- { k: 'Shots rendered', v: '12,480', d: '+2.1k' },
90
- { k: 'Cuts on the beat', v: '99.1%', d: '+1.4 pts' },
91
- ];
92
-
93
- const DashboardPage: React.FC<{ draw: number; dot: number; rows: number[] }> = ({ draw, dot, rows }) => {
94
- const [lx, ly] = pt(SERIES.length - 1);
95
- return (
96
- <div style={{
97
- position: 'absolute', inset: 0, borderRadius: PAGE_R, overflow: 'hidden', fontFamily: FONT.sans,
98
- background: `linear-gradient(180deg, #121a2e 0%, ${L.surface} 46%, #0c1222 100%)`,
99
- boxShadow: `inset 0 0 0 1.5px ${L.line}, inset 0 1.5px 0 rgba(200,215,255,0.16)`,
100
- }}>
101
- {/* 顶栏:下沿一条电光蓝发丝线——平躺时它就是开场那道"地平线" */}
102
- <div style={{
103
- position: 'absolute', left: 0, right: 0, top: 0, height: 104, display: 'flex', alignItems: 'center',
104
- padding: '0 64px', gap: 22, background: 'rgba(160,190,255,0.035)',
105
- }}>
106
- <ShotcraftMark size={48} tone="dark" style={{ flex: 'none' }} />
107
- <div style={{ ...type(36, 700), fontFamily: BRAND.font, letterSpacing: '0.03em', color: L.ink }}>{BRAND.name}</div>
108
- <div style={{ display: 'flex', gap: 44, marginLeft: 72, ...type(28, 550), color: L.ink3 }}>
109
- <span style={{ color: L.ink }}>Overview</span><span>Shots</span><span>Renders</span><span>Gallery</span>
110
- </div>
111
- <div style={{
112
- marginLeft: 'auto', padding: '12px 26px', borderRadius: 999, border: `1.5px solid ${L.line}`,
113
- ...type(26, 550), color: L.ink2, background: 'rgba(160,190,255,0.05)',
114
- }}>Last 12 months</div>
115
- <div style={{ width: 52, height: 52, borderRadius: 26, background: 'linear-gradient(135deg,#5b8cff,#3ee6d0)', boxShadow: `0 0 0 3px ${L.surface}` }} />
116
- </div>
117
- <div style={{
118
- position: 'absolute', left: 0, right: 0, top: 103, height: 2,
119
- background: `linear-gradient(90deg, ${alpha(L.accent, 0)} 0%, ${L.accent} 22%, #b9cdff 50%, ${L.accent} 78%, ${alpha(L.accent, 0)} 100%)`,
120
- boxShadow: `0 0 18px ${alpha(L.accent, 0.8)}`,
121
- }} />
122
-
123
- {/* 标题区 */}
124
- <div style={{ position: 'absolute', left: 120, top: 168, opacity: rows[0], transform: `translateY(${(1 - rows[0]) * 18}px)` }}>
125
- <div style={{ ...type(26, 650, { caps: true }), color: L.accent, letterSpacing: '0.2em' }}>Render studio · Q3 Overview</div>
126
- <div style={{ ...type(TYPE_H1, 760), color: L.ink, marginTop: 26 }}>
127
- Renders are up <span style={{ color: L.accent, textShadow: `0 0 40px ${alpha(L.accent, 0.45)}` }}>38%</span>
128
- </div>
129
- </div>
130
-
131
- {/* 面积图:横贯全宽 */}
132
- <div style={{ position: 'absolute', left: 160, top: 420, width: CH.w, height: CH.h + 60, opacity: rows[1] }}>
133
- {[0.25, 0.5, 0.75, 1].map((g) => (
134
- <div key={g} style={{ position: 'absolute', left: 0, right: 0, top: CH.h * (1 - g), height: 1.5, background: L.line }} />
135
- ))}
136
- <svg width={CH.w} height={CH.h} viewBox={`0 0 ${CH.w} ${CH.h}`} style={{ position: 'absolute', left: 0, top: 0, overflow: 'visible' }}>
137
- <defs>
138
- <linearGradient id="mer-area" x1="0" y1="0" x2="0" y2="1">
139
- <stop offset="0" stopColor={L.accent} stopOpacity={0.38} />
140
- <stop offset="1" stopColor={L.accent} stopOpacity={0} />
141
- </linearGradient>
142
- <clipPath id="mer-clip"><rect x={-10} y={-40} width={(CH.w + 20) * draw} height={CH.h + 80} /></clipPath>
143
- </defs>
144
- <g clipPath="url(#mer-clip)">
145
- <path d={areaPath} fill="url(#mer-area)" />
146
- <path d={linePath} fill="none" stroke={alpha(L.accent, 0.35)} strokeWidth={14} strokeLinecap="round" style={{ filter: 'blur(8px)' }} />
147
- <path d={linePath} fill="none" stroke="#a9c1ff" strokeWidth={5} strokeLinecap="round" />
148
- </g>
149
- {draw > 0.02 && draw < 0.995 && (() => {
150
- const i = Math.min(SERIES.length - 1, draw * (SERIES.length - 1));
151
- const i0 = Math.floor(i), i1 = Math.min(SERIES.length - 1, i0 + 1);
152
- const [ax, ay] = pt(i0), [bx, by] = pt(i1);
153
- const hx = ax + (bx - ax) * (i - i0), hy = ay + (by - ay) * (i - i0);
154
- return <circle cx={hx} cy={hy} r={9} fill="#e6edff" style={{ filter: `drop-shadow(0 0 10px ${L.accent})` }} />;
155
- })()}
156
- {dot > 0 && (
157
- <g opacity={dot}>
158
- <circle cx={lx} cy={ly} r={34 * dot} fill={alpha(L.accent, 0.18)} />
159
- <circle cx={lx} cy={ly} r={11} fill="#e6edff" stroke={L.accent} strokeWidth={5} />
160
- </g>
161
- )}
162
- </svg>
163
- <div style={{ position: 'absolute', left: 0, right: 0, top: CH.h + 22, display: 'flex', justifyContent: 'space-between', ...type(24, 550, { caps: true }), color: L.ink3, letterSpacing: '0.14em' }}>
164
- {['Oct', 'Dec', 'Feb', 'Apr', 'Jun', 'Sep'].map((m) => <span key={m}>{m}</span>)}
165
- </div>
166
- </div>
167
-
168
- {/* KPI 三格:大数字 + 涨幅 */}
169
- <div style={{ position: 'absolute', left: 120, right: 120, top: 830, display: 'flex', gap: 40 }}>
170
- {KPIS.map((k, i) => (
171
- <div key={k.k} style={{
172
- flex: 1, height: 190, borderRadius: 22, padding: '30px 38px', boxSizing: 'border-box',
173
- background: `linear-gradient(180deg, ${L.surface2} 0%, rgba(23,32,54,0.6) 100%)`,
174
- boxShadow: `inset 0 0 0 1.5px ${L.line}, inset 0 1.5px 0 rgba(200,215,255,0.1)`,
175
- opacity: 0.55 + 0.45 * rows[2 + i], transform: `translateY(${(1 - rows[2 + i]) * 26}px)`,
176
- }}>
177
- <div style={{ ...type(26, 550), color: L.ink2 }}>{k.k}</div>
178
- <div style={{ display: 'flex', alignItems: 'baseline', gap: 20, marginTop: 14 }}>
179
- <div style={{ ...type(76, 720), color: L.ink }}>{k.v}</div>
180
- <div style={{ ...type(28, 650), color: L.accent2 }}>{k.d}</div>
181
- </div>
182
- </div>
183
- ))}
184
- </div>
185
- </div>
186
- );
187
- };
188
- const TYPE_H1 = 120;
189
-
190
- export const TiltReveal: React.FC = () => {
191
- const f = useCurrentFrame();
192
- const { p, rotX, scale: s0, bot, eye, persp } = poseAt(f);
193
- // 落定后极缓推近(hold 段机位活着)
194
- const push = mix(1, 1.018, ramp(f, 70, 50, EASE.smooth));
195
- const scale = s0 * push;
196
- const botY = 540 + (bot - 540) * push;
197
- const topY = botY - 1080 * scale; // 布局框上缘(3D 变换前)
198
-
199
- // 抬头角速度(°/帧)→ 画面竖向位移近似,只在快段生效
200
- const vRot = poseAt(f + 0.5).rotX - poseAt(f - 0.5).rotX;
201
- const vy = -vRot * 7;
202
-
203
- // Q2:等效 rotateX'·scaleY(在 s 倍布局的平面上),投影与 scale(s)·rotateX(r) 一致
204
- const rad = (rotX * Math.PI) / 180;
205
- const rEq = (Math.atan2(Math.sin(rad), scale * Math.cos(rad)) * 180) / Math.PI;
206
- const kEq = Math.sqrt(scale * scale * Math.cos(rad) ** 2 + Math.sin(rad) ** 2) / scale;
207
- const vScale = kEq * Math.abs(Math.cos((rEq * Math.PI) / 180));
208
- const sigma = vScale > 0.6 ? 0 : (0.55 / Math.max(0.05, vScale)) * 1.6 - 1.2;
209
-
210
- const flat = Math.min(1, Math.abs(rotX) / 86); // 1 = 平躺
211
- // 远端(页面上沿)在屏幕上的投影 y:开场那道"地平线"就挂在这里
212
- const Hs = 1080 * scale * kEq;
213
- const zFar = -Hs * Math.sin((rEq * Math.PI) / 180);
214
- const farY = eye + (botY - Hs * Math.cos((rEq * Math.PI) / 180) - eye) * (persp / (persp - zFar));
215
- const glowUp = ramp(f, 0, 26, EASE.out); // 开场背光由暗到亮
216
- // 背景视差:相机抬头 → 舞台光池 / 浮尘相对下移
217
- const bgShift = mix(-150, 0, p);
218
- // 镜面反光带:随俯角从上沿扫到下沿(裁进页面圆角)
219
- const sheen = ramp(f, 32, 30, EASE.swift);
220
- // 内容:折线描出、终点光点、行错峰
221
- const draw = ramp(f, 38, 44, EASE.out);
222
- const dot = ramp(f, 80, 14, EASE.overshoot);
223
- const rows = [0, 1, 2, 3, 4].map((i) => ramp(f, 34 + i * 4, 22, EASE.out));
224
- // 开场"地平线":页面上缘的电光蓝缘光,平躺时最亮,抬起后收成页面上沿的一道高光
225
- const rim = glowUp * Math.pow(flat, 3);
226
- rows[0] = Math.max(rows[0], 0.85 + 0.15 * ramp(f, 30, 20, EASE.out)); // 标题平躺时就在(窄带里能看见)
227
- rows[1] = 1;
228
-
229
- return (
230
- <AbsoluteFill style={{ overflow: 'hidden', background: L.bg[2] }}>
231
- <Stage look={L} keyLight={{ x: 0.5, y: 0.0 }} fill={{ x: 0.82, y: 0.95 }} intensity={0.75 + 0.25 * glowUp} breathe={0.6}
232
- style={{ transform: `translateY(${bgShift}px)`, inset: '-160px 0 -160px 0' }}>
233
- <Dust look={L} count={34} seed={7} drift={0.18} opacity={0.5} />
234
- </Stage>
235
-
236
- {/* 页面背后的背光:平躺时是一条贴着窄带的蓝色辉光,抬起后成为页面四周的轮廓光 */}
237
- <div style={{
238
- position: 'absolute', left: 960 - 900, width: 1800, top: mix(farY - 90, farY - 40, p), height: mix(180, 1000, p),
239
- background: `radial-gradient(ellipse 50% 50% at 50% 50%, ${alpha(L.light, 0.55 * glowUp)} 0%, ${alpha(L.light, 0)} 70%)`,
240
- filter: 'blur(30px)', opacity: 0.9,
241
- }} />
242
- {/* 地面反光:页面脚下一片蓝色光晕 */}
243
- <div style={{
244
- position: 'absolute', left: 160, right: 160, top: 1080 - 150, height: 260, opacity: p,
245
- background: `radial-gradient(ellipse 50% 40% at 50% 30%, ${alpha(L.accent, 0.4)} 0%, ${alpha(L.accent, 0.08)} 55%, ${alpha(L.accent, 0)} 75%)`,
246
- }} />
247
-
248
- <SpeedBlur vx={0} vy={vy} amount={0.2} max={9}>
249
- <div style={{ position: 'absolute', inset: 0, perspective: persp, perspectiveOrigin: `50% ${(eye / 1080) * 100}%` }}>
250
- <div style={{
251
- position: 'absolute', left: 960 - 960 * scale, top: topY, width: 1920 * scale, height: 1080 * scale,
252
- transformOrigin: '50% 100%', transform: `rotateX(${rEq}deg) scaleY(${kEq})`,
253
- borderRadius: PAGE_R * scale, overflow: 'hidden',
254
- boxShadow: `0 ${40 * scale}px ${120 * scale}px ${alpha(L.shadow, 0.7)}, 0 0 ${60 * scale}px ${alpha(L.light, 0.18 * (1 - flat))}`,
255
- }}>
256
- {sigma > 0.5 && (
257
- <svg width={0} height={0} style={{ position: 'absolute' }} aria-hidden>
258
- <filter id="tilt-aa" x="0" y="-5%" width="100%" height="110%" colorInterpolationFilters="sRGB">
259
- <feGaussianBlur stdDeviation={`0 ${sigma.toFixed(2)}`} />
260
- </filter>
261
- </svg>
262
- )}
263
- <div style={{ position: 'absolute', left: 0, top: 0, width: 1920, height: 1080, zoom: scale, filter: sigma > 0.5 ? 'url(#tilt-aa)' : undefined }}>
264
- <DashboardPage draw={draw} dot={dot} rows={rows} />
265
- </div>
266
- {/* 掠射受光:平躺时远端(页面下部,远离铰链)沉入夜色 */}
267
- <div style={{
268
- position: 'absolute', inset: 0, pointerEvents: 'none',
269
- background: `linear-gradient(0deg, ${alpha(L.bg[2], 0.1 * flat)} 0%, ${alpha(L.bg[2], 0.5 * flat)} 45%, ${alpha(L.bg[2], 0.9 * flat ** 1.5)} 100%)`,
270
- }} />
271
- {/* 镜面反光带:一次,从上沿扫到下沿 */}
272
- {sheen > 0 && sheen < 1 && (
273
- <div style={{
274
- position: 'absolute', inset: 0, pointerEvents: 'none', mixBlendMode: 'screen',
275
- background: `linear-gradient(180deg, transparent ${(sheen * 130 - 30).toFixed(1)}%, ${alpha('#9fb6ff', 0.16 * Math.sin(sheen * Math.PI))} ${(sheen * 130 - 12).toFixed(1)}%, transparent ${(sheen * 130 + 6).toFixed(1)}%)`,
276
- }} />
277
- )}
278
- </div>
279
- </div>
280
- </SpeedBlur>
281
-
282
- {/* 地平线缘光:一条贴着窄带上沿的亮线 + 宽幅泛光(屏幕空间,随铰链走) */}
283
- {rim > 0.01 && (
284
- <>
285
- <div style={{
286
- position: 'absolute', left: 0, right: 0, top: farY - 60, height: 120, opacity: rim, pointerEvents: 'none',
287
- background: `radial-gradient(ellipse 46% 50% at 50% 50%, ${alpha(L.accent, 0.5)} 0%, ${alpha(L.accent, 0)} 70%)`,
288
- mixBlendMode: 'screen',
289
- }} />
290
- <div style={{
291
- position: 'absolute', left: 0, right: 0, top: farY - 1.5, height: 3, opacity: rim, pointerEvents: 'none',
292
- background: `linear-gradient(90deg, ${alpha('#cfdcff', 0)} 4%, #cfdcff 32%, #ffffff 50%, #cfdcff 68%, ${alpha('#cfdcff', 0)} 96%)`,
293
- boxShadow: `0 0 14px ${alpha(L.accent, 0.9)}, 0 0 40px ${alpha(L.accent, 0.6)}`,
294
- }} />
295
- </>
296
- )}
297
- </AbsoluteFill>
298
- );
299
- };
1
+ // tilt-reveal|俯仰揭示(第二轮重设计)
2
+ // 手法不变:整页 rotateX 平躺、开场只见上缘一条透视窄带,机位"抬头"回正,内容一排排涌入视野。
3
+ //
4
+ // 设计决定
5
+ // - look:midnight(深蓝夜 · 电光蓝)。开场是黑夜里的一道"地平线"——平躺页面的远端上缘只剩一条
6
+ // 发光的窄带(远端上沿一道白蓝亮线 + 宽幅蓝色泛光),像天际线上的第一道光。
7
+ // - 主体:为镜头设计的 video-shotcraft 暗场渲染看板——顶栏(品牌标志 + 字标)、120px 大标题「Renders are up 38%」、
8
+ // 一张横贯全宽的发光面积图、三块 76px 大数字 KPI。元素少、字大、对比强,落定就是一张海报。
9
+ // 页面落定在画面里留边(0.84 倍),四周能看到舞台光,脚下有一片蓝色光晕"地面反光"。
10
+ // - 运镜:页面绕下沿铰链、正面朝上平躺(视点在页面上方,窄带里的字是正的),rotateX 86°→−2.2° 过冲→0° 抬正,
11
+ // 同一条进度 p 驱动缩放 2.5→0.84、铰链位置、视点高度、透视距离;背景光池与浮尘按俯仰反向视差下移——读作"相机抬头",而不是页面在转。
12
+ // - 光:抬升过程中一道镜面反光带从页面上沿扫到下沿(掠射角变化的物理反光,Q4:主角一次、
13
+ // 裁进圆角);面积图的发光折线在抬升后半程描出,落定时终点亮起一颗光点。
14
+ // - Q2:放大不走 transform scale,按目标倍率布局 + CSS zoom 栅格化,再用等效 rotateX'·scaleY 还原透视;
15
+ // 平躺时按纵向压缩比做只竖向的抗锯齿预模糊,读得清之前自动关掉。
16
+ //
17
+ // 时间表(30fps,共 120f)
18
+ // 0–20 预备:窄带已在画面(第 1 帧就有那道光),极缓 creep 86°→83°,背光由暗到亮
19
+ // 20–60 抬头 40f:不对称 in-out(起步柔、中段快、末端零速),冲到 −2.2° 过冲顶点;
20
+ // 最快的几帧给竖向运动模糊;32–62 镜面反光带扫过页面
21
+ // 60–70 软回 0°(smooth)——机位落定
22
+ // 38–82 面积图折线描出(out,带一颗发光笔头),80f 终点光点亮起;KPI 三格错峰上浮提亮(行比底板晚一拍)
23
+ // 70–120 hold 50f:极缓推近 1→1.018、背光呼吸,尾帧是完整海报
24
+ import React from 'react';
25
+ import { AbsoluteFill, useCurrentFrame } from 'remotion';
26
+ import { Dust, LOOKS, Stage, alpha, type } from '../../_fixtures/Look';
27
+ import { EASE, FONT, SpeedBlur, mix, ramp } from '../../_fixtures/Polish';
28
+ import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
29
+
30
+ export const TILT_REVEAL_DURATION = 120;
31
+
32
+ const L = LOOKS.midnight;
33
+
34
+ const HOLD = 20; // 预备 creep 结束
35
+ const MOVE = 40; // 主抬升 20→60
36
+ const SETTLE = 10; // 过冲回落 60→70
37
+ const FROM = 86; // 平躺俯角(页面绕下沿铰链向远处躺倒,正面朝上)
38
+ const CREEP = 3 / 86; // 预备段先抬 3°
39
+ const OVER = 1 + 2.2 / 86; // 主抬升冲过 0° 到 +2.2°
40
+ const S0 = 2.5; // 平躺时的放大倍率(窄带够宽、够近)
41
+ const S1 = 0.84; // 落定倍率:页面四周留出舞台
42
+ const BOT0 = 600; // 平躺时铰链(页面下沿)的屏幕 y——窄带落在画面中线附近
43
+ const BOT1 = 540 + (1080 * S1) / 2 - 18; // 落定时页面下沿(略偏上,给脚下反光留位)
44
+ const PAGE_R = 26; // 页面圆角(1x 页面 px)
45
+
46
+ // 时间 → 姿态(纯函数;速度用中心差分求)。角度走带过冲的 q,缩放/位移/透视走不过冲的 p
47
+ const poseAt = (f: number) => {
48
+ const creep = ramp(f, 0, HOLD, EASE.smooth) * CREEP;
49
+ const lift = ramp(f, HOLD, MOVE, EASE.swift);
50
+ const q = mix(creep, OVER, lift) - (OVER - 1) * ramp(f, HOLD + MOVE, SETTLE, EASE.smooth);
51
+ const p = mix(creep, 1, lift);
52
+ return {
53
+ p,
54
+ rotX: FROM * (1 - q),
55
+ scale: mix(S0, S1, p),
56
+ bot: mix(BOT0, BOT1, p),
57
+ eye: mix(BOT0 - 300, 520, p), // 视点高度:平躺时在页面上方(俯视看到正面),落定时回到画面中心
58
+ persp: mix(700, 1500, p),
59
+ };
60
+ };
61
+
62
+ // ───────────── 页面:video-shotcraft 暗场渲染看板(1920×1080 设计坐标) ─────────────
63
+
64
+ // 面积图数据(确定性):缓升 + 两次回落 + 末段冲高
65
+ const SERIES = [22, 26, 24, 31, 35, 33, 38, 44, 41, 47, 52, 49, 55, 61, 58, 66, 71, 69, 78, 86];
66
+ const CH = { x: 0, y: 0, w: 1600, h: 300 };
67
+ const pt = (i: number) => {
68
+ const x = CH.x + (i / (SERIES.length - 1)) * CH.w;
69
+ const y = CH.y + CH.h - (SERIES[i] / 100) * CH.h;
70
+ return [x, y] as const;
71
+ };
72
+ // Catmull-Rom → 三次贝塞尔,平滑折线
73
+ const linePath = (() => {
74
+ let d = '';
75
+ for (let i = 0; i < SERIES.length; i++) {
76
+ const [x, y] = pt(i);
77
+ if (i === 0) { d += `M${x},${y}`; continue; }
78
+ const [x0, y0] = pt(Math.max(0, i - 2));
79
+ const [x1, y1] = pt(i - 1);
80
+ const [x3, y3] = pt(Math.min(SERIES.length - 1, i + 1));
81
+ d += ` C${x1 + (x - x0) / 6},${y1 + (y - y0) / 6} ${x - (x3 - x1) / 6},${y - (y3 - y1) / 6} ${x},${y}`;
82
+ }
83
+ return d;
84
+ })();
85
+ const areaPath = `${linePath} L${CH.w},${CH.h} L0,${CH.h} Z`;
86
+
87
+ const KPIS = [
88
+ { k: 'Frames rendered', v: '4.82M', d: '+38%' },
89
+ { k: 'Shots rendered', v: '12,480', d: '+2.1k' },
90
+ { k: 'Cuts on the beat', v: '99.1%', d: '+1.4 pts' },
91
+ ];
92
+
93
+ const DashboardPage: React.FC<{ draw: number; dot: number; rows: number[] }> = ({ draw, dot, rows }) => {
94
+ const [lx, ly] = pt(SERIES.length - 1);
95
+ return (
96
+ <div style={{
97
+ position: 'absolute', inset: 0, borderRadius: PAGE_R, overflow: 'hidden', fontFamily: FONT.sans,
98
+ background: `linear-gradient(180deg, #121a2e 0%, ${L.surface} 46%, #0c1222 100%)`,
99
+ boxShadow: `inset 0 0 0 1.5px ${L.line}, inset 0 1.5px 0 rgba(200,215,255,0.16)`,
100
+ }}>
101
+ {/* 顶栏:下沿一条电光蓝发丝线——平躺时它就是开场那道"地平线" */}
102
+ <div style={{
103
+ position: 'absolute', left: 0, right: 0, top: 0, height: 104, display: 'flex', alignItems: 'center',
104
+ padding: '0 64px', gap: 22, background: 'rgba(160,190,255,0.035)',
105
+ }}>
106
+ <ShotcraftMark size={48} tone="dark" style={{ flex: 'none' }} />
107
+ <div style={{ ...type(36, 700), fontFamily: BRAND.font, letterSpacing: '0.03em', color: L.ink }}>{BRAND.name}</div>
108
+ <div style={{ display: 'flex', gap: 44, marginLeft: 72, ...type(28, 550), color: L.ink3 }}>
109
+ <span style={{ color: L.ink }}>Overview</span><span>Shots</span><span>Renders</span><span>Gallery</span>
110
+ </div>
111
+ <div style={{
112
+ marginLeft: 'auto', padding: '12px 26px', borderRadius: 999, border: `1.5px solid ${L.line}`,
113
+ ...type(26, 550), color: L.ink2, background: 'rgba(160,190,255,0.05)',
114
+ }}>Last 12 months</div>
115
+ <div style={{ width: 52, height: 52, borderRadius: 26, background: 'linear-gradient(135deg,#5b8cff,#3ee6d0)', boxShadow: `0 0 0 3px ${L.surface}` }} />
116
+ </div>
117
+ <div style={{
118
+ position: 'absolute', left: 0, right: 0, top: 103, height: 2,
119
+ background: `linear-gradient(90deg, ${alpha(L.accent, 0)} 0%, ${L.accent} 22%, #b9cdff 50%, ${L.accent} 78%, ${alpha(L.accent, 0)} 100%)`,
120
+ boxShadow: `0 0 18px ${alpha(L.accent, 0.8)}`,
121
+ }} />
122
+
123
+ {/* 标题区 */}
124
+ <div style={{ position: 'absolute', left: 120, top: 168, opacity: rows[0], transform: `translateY(${(1 - rows[0]) * 18}px)` }}>
125
+ <div style={{ ...type(26, 650, { caps: true }), color: L.accent, letterSpacing: '0.2em' }}>Render studio · Q3 Overview</div>
126
+ <div style={{ ...type(TYPE_H1, 760), color: L.ink, marginTop: 26 }}>
127
+ Renders are up <span style={{ color: L.accent, textShadow: `0 0 40px ${alpha(L.accent, 0.45)}` }}>38%</span>
128
+ </div>
129
+ </div>
130
+
131
+ {/* 面积图:横贯全宽 */}
132
+ <div style={{ position: 'absolute', left: 160, top: 420, width: CH.w, height: CH.h + 60, opacity: rows[1] }}>
133
+ {[0.25, 0.5, 0.75, 1].map((g) => (
134
+ <div key={g} style={{ position: 'absolute', left: 0, right: 0, top: CH.h * (1 - g), height: 1.5, background: L.line }} />
135
+ ))}
136
+ <svg width={CH.w} height={CH.h} viewBox={`0 0 ${CH.w} ${CH.h}`} style={{ position: 'absolute', left: 0, top: 0, overflow: 'visible' }}>
137
+ <defs>
138
+ <linearGradient id="mer-area" x1="0" y1="0" x2="0" y2="1">
139
+ <stop offset="0" stopColor={L.accent} stopOpacity={0.38} />
140
+ <stop offset="1" stopColor={L.accent} stopOpacity={0} />
141
+ </linearGradient>
142
+ <clipPath id="mer-clip"><rect x={-10} y={-40} width={(CH.w + 20) * draw} height={CH.h + 80} /></clipPath>
143
+ </defs>
144
+ <g clipPath="url(#mer-clip)">
145
+ <path d={areaPath} fill="url(#mer-area)" />
146
+ <path d={linePath} fill="none" stroke={alpha(L.accent, 0.35)} strokeWidth={14} strokeLinecap="round" style={{ filter: 'blur(8px)' }} />
147
+ <path d={linePath} fill="none" stroke="#a9c1ff" strokeWidth={5} strokeLinecap="round" />
148
+ </g>
149
+ {draw > 0.02 && draw < 0.995 && (() => {
150
+ const i = Math.min(SERIES.length - 1, draw * (SERIES.length - 1));
151
+ const i0 = Math.floor(i), i1 = Math.min(SERIES.length - 1, i0 + 1);
152
+ const [ax, ay] = pt(i0), [bx, by] = pt(i1);
153
+ const hx = ax + (bx - ax) * (i - i0), hy = ay + (by - ay) * (i - i0);
154
+ return <circle cx={hx} cy={hy} r={9} fill="#e6edff" style={{ filter: `drop-shadow(0 0 10px ${L.accent})` }} />;
155
+ })()}
156
+ {dot > 0 && (
157
+ <g opacity={dot}>
158
+ <circle cx={lx} cy={ly} r={34 * dot} fill={alpha(L.accent, 0.18)} />
159
+ <circle cx={lx} cy={ly} r={11} fill="#e6edff" stroke={L.accent} strokeWidth={5} />
160
+ </g>
161
+ )}
162
+ </svg>
163
+ <div style={{ position: 'absolute', left: 0, right: 0, top: CH.h + 22, display: 'flex', justifyContent: 'space-between', ...type(24, 550, { caps: true }), color: L.ink3, letterSpacing: '0.14em' }}>
164
+ {['Oct', 'Dec', 'Feb', 'Apr', 'Jun', 'Sep'].map((m) => <span key={m}>{m}</span>)}
165
+ </div>
166
+ </div>
167
+
168
+ {/* KPI 三格:大数字 + 涨幅 */}
169
+ <div style={{ position: 'absolute', left: 120, right: 120, top: 830, display: 'flex', gap: 40 }}>
170
+ {KPIS.map((k, i) => (
171
+ <div key={k.k} style={{
172
+ flex: 1, height: 190, borderRadius: 22, padding: '30px 38px', boxSizing: 'border-box',
173
+ background: `linear-gradient(180deg, ${L.surface2} 0%, rgba(23,32,54,0.6) 100%)`,
174
+ boxShadow: `inset 0 0 0 1.5px ${L.line}, inset 0 1.5px 0 rgba(200,215,255,0.1)`,
175
+ opacity: 0.55 + 0.45 * rows[2 + i], transform: `translateY(${(1 - rows[2 + i]) * 26}px)`,
176
+ }}>
177
+ <div style={{ ...type(26, 550), color: L.ink2 }}>{k.k}</div>
178
+ <div style={{ display: 'flex', alignItems: 'baseline', gap: 20, marginTop: 14 }}>
179
+ <div style={{ ...type(76, 720), color: L.ink }}>{k.v}</div>
180
+ <div style={{ ...type(28, 650), color: L.accent2 }}>{k.d}</div>
181
+ </div>
182
+ </div>
183
+ ))}
184
+ </div>
185
+ </div>
186
+ );
187
+ };
188
+ const TYPE_H1 = 120;
189
+
190
+ export const TiltReveal: React.FC = () => {
191
+ const f = useCurrentFrame();
192
+ const { p, rotX, scale: s0, bot, eye, persp } = poseAt(f);
193
+ // 落定后极缓推近(hold 段机位活着)
194
+ const push = mix(1, 1.018, ramp(f, 70, 50, EASE.smooth));
195
+ const scale = s0 * push;
196
+ const botY = 540 + (bot - 540) * push;
197
+ const topY = botY - 1080 * scale; // 布局框上缘(3D 变换前)
198
+
199
+ // 抬头角速度(°/帧)→ 画面竖向位移近似,只在快段生效
200
+ const vRot = poseAt(f + 0.5).rotX - poseAt(f - 0.5).rotX;
201
+ const vy = -vRot * 7;
202
+
203
+ // Q2:等效 rotateX'·scaleY(在 s 倍布局的平面上),投影与 scale(s)·rotateX(r) 一致
204
+ const rad = (rotX * Math.PI) / 180;
205
+ const rEq = (Math.atan2(Math.sin(rad), scale * Math.cos(rad)) * 180) / Math.PI;
206
+ const kEq = Math.sqrt(scale * scale * Math.cos(rad) ** 2 + Math.sin(rad) ** 2) / scale;
207
+ const vScale = kEq * Math.abs(Math.cos((rEq * Math.PI) / 180));
208
+ const sigma = vScale > 0.6 ? 0 : (0.55 / Math.max(0.05, vScale)) * 1.6 - 1.2;
209
+
210
+ const flat = Math.min(1, Math.abs(rotX) / 86); // 1 = 平躺
211
+ // 远端(页面上沿)在屏幕上的投影 y:开场那道"地平线"就挂在这里
212
+ const Hs = 1080 * scale * kEq;
213
+ const zFar = -Hs * Math.sin((rEq * Math.PI) / 180);
214
+ const farY = eye + (botY - Hs * Math.cos((rEq * Math.PI) / 180) - eye) * (persp / (persp - zFar));
215
+ const glowUp = ramp(f, 0, 26, EASE.out); // 开场背光由暗到亮
216
+ // 背景视差:相机抬头 → 舞台光池 / 浮尘相对下移
217
+ const bgShift = mix(-150, 0, p);
218
+ // 镜面反光带:随俯角从上沿扫到下沿(裁进页面圆角)
219
+ const sheen = ramp(f, 32, 30, EASE.swift);
220
+ // 内容:折线描出、终点光点、行错峰
221
+ const draw = ramp(f, 38, 44, EASE.out);
222
+ const dot = ramp(f, 80, 14, EASE.overshoot);
223
+ const rows = [0, 1, 2, 3, 4].map((i) => ramp(f, 34 + i * 4, 22, EASE.out));
224
+ // 开场"地平线":页面上缘的电光蓝缘光,平躺时最亮,抬起后收成页面上沿的一道高光
225
+ const rim = glowUp * Math.pow(flat, 3);
226
+ rows[0] = Math.max(rows[0], 0.85 + 0.15 * ramp(f, 30, 20, EASE.out)); // 标题平躺时就在(窄带里能看见)
227
+ rows[1] = 1;
228
+
229
+ return (
230
+ <AbsoluteFill style={{ overflow: 'hidden', background: L.bg[2] }}>
231
+ <Stage look={L} keyLight={{ x: 0.5, y: 0.0 }} fill={{ x: 0.82, y: 0.95 }} intensity={0.75 + 0.25 * glowUp} breathe={0.6}
232
+ style={{ transform: `translateY(${bgShift}px)`, inset: '-160px 0 -160px 0' }}>
233
+ <Dust look={L} count={34} seed={7} drift={0.18} opacity={0.5} />
234
+ </Stage>
235
+
236
+ {/* 页面背后的背光:平躺时是一条贴着窄带的蓝色辉光,抬起后成为页面四周的轮廓光 */}
237
+ <div style={{
238
+ position: 'absolute', left: 960 - 900, width: 1800, top: mix(farY - 90, farY - 40, p), height: mix(180, 1000, p),
239
+ background: `radial-gradient(ellipse 50% 50% at 50% 50%, ${alpha(L.light, 0.55 * glowUp)} 0%, ${alpha(L.light, 0)} 70%)`,
240
+ filter: 'blur(30px)', opacity: 0.9,
241
+ }} />
242
+ {/* 地面反光:页面脚下一片蓝色光晕 */}
243
+ <div style={{
244
+ position: 'absolute', left: 160, right: 160, top: 1080 - 150, height: 260, opacity: p,
245
+ background: `radial-gradient(ellipse 50% 40% at 50% 30%, ${alpha(L.accent, 0.4)} 0%, ${alpha(L.accent, 0.08)} 55%, ${alpha(L.accent, 0)} 75%)`,
246
+ }} />
247
+
248
+ <SpeedBlur vx={0} vy={vy} amount={0.2} max={9}>
249
+ <div style={{ position: 'absolute', inset: 0, perspective: persp, perspectiveOrigin: `50% ${(eye / 1080) * 100}%` }}>
250
+ <div style={{
251
+ position: 'absolute', left: 960 - 960 * scale, top: topY, width: 1920 * scale, height: 1080 * scale,
252
+ transformOrigin: '50% 100%', transform: `rotateX(${rEq}deg) scaleY(${kEq})`,
253
+ borderRadius: PAGE_R * scale, overflow: 'hidden',
254
+ boxShadow: `0 ${40 * scale}px ${120 * scale}px ${alpha(L.shadow, 0.7)}, 0 0 ${60 * scale}px ${alpha(L.light, 0.18 * (1 - flat))}`,
255
+ }}>
256
+ {sigma > 0.5 && (
257
+ <svg width={0} height={0} style={{ position: 'absolute' }} aria-hidden>
258
+ <filter id="tilt-aa" x="0" y="-5%" width="100%" height="110%" colorInterpolationFilters="sRGB">
259
+ <feGaussianBlur stdDeviation={`0 ${sigma.toFixed(2)}`} />
260
+ </filter>
261
+ </svg>
262
+ )}
263
+ <div style={{ position: 'absolute', left: 0, top: 0, width: 1920, height: 1080, zoom: scale, filter: sigma > 0.5 ? 'url(#tilt-aa)' : undefined }}>
264
+ <DashboardPage draw={draw} dot={dot} rows={rows} />
265
+ </div>
266
+ {/* 掠射受光:平躺时远端(页面下部,远离铰链)沉入夜色 */}
267
+ <div style={{
268
+ position: 'absolute', inset: 0, pointerEvents: 'none',
269
+ background: `linear-gradient(0deg, ${alpha(L.bg[2], 0.1 * flat)} 0%, ${alpha(L.bg[2], 0.5 * flat)} 45%, ${alpha(L.bg[2], 0.9 * flat ** 1.5)} 100%)`,
270
+ }} />
271
+ {/* 镜面反光带:一次,从上沿扫到下沿 */}
272
+ {sheen > 0 && sheen < 1 && (
273
+ <div style={{
274
+ position: 'absolute', inset: 0, pointerEvents: 'none', mixBlendMode: 'screen',
275
+ background: `linear-gradient(180deg, transparent ${(sheen * 130 - 30).toFixed(1)}%, ${alpha('#9fb6ff', 0.16 * Math.sin(sheen * Math.PI))} ${(sheen * 130 - 12).toFixed(1)}%, transparent ${(sheen * 130 + 6).toFixed(1)}%)`,
276
+ }} />
277
+ )}
278
+ </div>
279
+ </div>
280
+ </SpeedBlur>
281
+
282
+ {/* 地平线缘光:一条贴着窄带上沿的亮线 + 宽幅泛光(屏幕空间,随铰链走) */}
283
+ {rim > 0.01 && (
284
+ <>
285
+ <div style={{
286
+ position: 'absolute', left: 0, right: 0, top: farY - 60, height: 120, opacity: rim, pointerEvents: 'none',
287
+ background: `radial-gradient(ellipse 46% 50% at 50% 50%, ${alpha(L.accent, 0.5)} 0%, ${alpha(L.accent, 0)} 70%)`,
288
+ mixBlendMode: 'screen',
289
+ }} />
290
+ <div style={{
291
+ position: 'absolute', left: 0, right: 0, top: farY - 1.5, height: 3, opacity: rim, pointerEvents: 'none',
292
+ background: `linear-gradient(90deg, ${alpha('#cfdcff', 0)} 4%, #cfdcff 32%, #ffffff 50%, #cfdcff 68%, ${alpha('#cfdcff', 0)} 96%)`,
293
+ boxShadow: `0 0 14px ${alpha(L.accent, 0.9)}, 0 0 40px ${alpha(L.accent, 0.6)}`,
294
+ }} />
295
+ </>
296
+ )}
297
+ </AbsoluteFill>
298
+ );
299
+ };