dsh-drawai 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/README.md +96 -253
  2. package/lib/client.js +28 -7
  3. package/lib/index.js +474 -97
  4. package/lib/motion/asset-pack.js +109 -50
  5. package/lib/motion/assets.js +291 -291
  6. package/lib/motion/demo-assets-lock.js +10 -0
  7. package/lib/motion/mgstyles/vendor/README.md +28 -0
  8. package/lib/motion/mgstyles/vendor/modules/d3/LICENSE +13 -0
  9. package/lib/motion/mgstyles/vendor/modules/d3/dist/d3.min.js +2 -0
  10. package/lib/motion/mgstyles/vendor/modules/opentype.js/LICENSE +20 -0
  11. package/lib/motion/mgstyles/vendor/modules/opentype.js/dist/opentype.mjs +14460 -0
  12. package/lib/motion/mgstyles/vendor/modules/simplex-noise/LICENSE +21 -0
  13. package/lib/motion/mgstyles/vendor/modules/simplex-noise/dist/esm/simplex-noise.js +466 -0
  14. package/lib/motion/mgstyles/vendor/modules/topojson-client/LICENSE +13 -0
  15. package/lib/motion/mgstyles/vendor/modules/topojson-client/dist/topojson-client.min.js +2 -0
  16. package/lib/motion/preview.js +10 -3
  17. package/lib/motion/render.js +19 -1
  18. package/lib/motion/shotcraft/upstream/SKILL.md +286 -286
  19. package/lib/motion/shotcraft/upstream/assets/lib/Caption.tsx +54 -54
  20. package/lib/motion/shotcraft/upstream/assets/lib/ClipCard.tsx +200 -200
  21. package/lib/motion/shotcraft/upstream/assets/lib/DigitRoll.tsx +45 -45
  22. package/lib/motion/shotcraft/upstream/assets/lib/FlashCut.tsx +20 -20
  23. package/lib/motion/shotcraft/upstream/assets/lib/FlatPanel.tsx +65 -65
  24. package/lib/motion/shotcraft/upstream/assets/lib/PageCam.tsx +151 -151
  25. package/lib/motion/shotcraft/upstream/assets/lib/VerticalTicker.tsx +129 -129
  26. package/lib/motion/shotcraft/upstream/assets/lib/helpers/camera.tsx +75 -75
  27. package/lib/motion/shotcraft/upstream/assets/lib/helpers/motion.ts +40 -40
  28. package/lib/motion/shotcraft/upstream/assets/lib/helpers/rand.ts +11 -11
  29. package/lib/motion/shotcraft/upstream/assets/lib/helpers/shake.ts +10 -10
  30. package/lib/motion/shotcraft/upstream/assets/scripts/build-readme-cover.mjs +49 -49
  31. package/lib/motion/shotcraft/upstream/assets/scripts/capture-template.mjs +210 -210
  32. package/lib/motion/shotcraft/upstream/assets/scripts/sfx-source.py +423 -423
  33. package/lib/motion/shotcraft/upstream/assets/scripts/smoke-render-demos.py +170 -170
  34. package/lib/motion/shotcraft/upstream/assets/scripts/test_sfx_source.py +157 -157
  35. package/lib/motion/shotcraft/upstream/demos/README.md +120 -120
  36. package/lib/motion/shotcraft/upstream/demos/_fixtures/Brand.tsx +112 -112
  37. package/lib/motion/shotcraft/upstream/demos/_fixtures/Fixtures.tsx +647 -647
  38. package/lib/motion/shotcraft/upstream/demos/_fixtures/Look.tsx +316 -316
  39. package/lib/motion/shotcraft/upstream/demos/_fixtures/Motion.tsx +82 -82
  40. package/lib/motion/shotcraft/upstream/demos/_fixtures/PageCam2D.tsx +115 -115
  41. package/lib/motion/shotcraft/upstream/demos/_fixtures/Polish.tsx +243 -243
  42. package/lib/motion/shotcraft/upstream/demos/_textures/live-layout.json +388 -388
  43. package/lib/motion/shotcraft/upstream/demos/camera/basic-3d-scene/Basic3DScene.tsx +250 -250
  44. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashImpactReal.tsx +305 -305
  45. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashZoomReal.tsx +246 -246
  46. package/lib/motion/shotcraft/upstream/demos/camera/cursor-flyover/CursorFlyover.tsx +390 -390
  47. package/lib/motion/shotcraft/upstream/demos/camera/depth-layer-moves/MultiplaneReal.tsx +138 -138
  48. package/lib/motion/shotcraft/upstream/demos/camera/graze-face-tour/GrazeFaceTour.tsx +542 -542
  49. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/OverheadTabletopDrop.tsx +315 -315
  50. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/TiltReveal.tsx +299 -299
  51. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/DroneDiveLanding.tsx +173 -173
  52. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/ExplodedView.tsx +348 -348
  53. package/lib/motion/shotcraft/upstream/demos/camera/steep-tilt-glide/SteepTiltGlide.tsx +366 -366
  54. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx +279 -279
  55. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/PullBackIsolation.tsx +184 -184
  56. package/lib/motion/shotcraft/upstream/demos/camera/terminal-3d/Terminal3D.tsx +390 -390
  57. package/lib/motion/shotcraft/upstream/demos/data/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +155 -155
  58. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/AxisRescaleShockV2.tsx +303 -303
  59. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/OscilloscopeStreamV2.tsx +290 -290
  60. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/UnitDotSwarmRegroupV2.tsx +278 -278
  61. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/NeedleSweepSelftest.tsx +307 -307
  62. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/TapeScrollFixedPointer.tsx +215 -215
  63. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/BrakeReticleLock.tsx +299 -299
  64. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/ChangelogScrollBrake.tsx +232 -232
  65. package/lib/motion/shotcraft/upstream/demos/data/timeline-travel/TimelineTravel.tsx +290 -290
  66. package/lib/motion/shotcraft/upstream/demos/effects/assemble-then-type-flyin/AssembleThenTypeFlyin.tsx +273 -273
  67. package/lib/motion/shotcraft/upstream/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx +167 -167
  68. package/lib/motion/shotcraft/upstream/demos/effects/brand-frame-snap/BrandFrameSnap.tsx +536 -536
  69. package/lib/motion/shotcraft/upstream/demos/effects/fui-hud-moves/ReticleLockOn.tsx +164 -164
  70. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/FlylineArc.tsx +175 -175
  71. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/GlowOrbAmbient.tsx +197 -197
  72. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/OrbFlylineRelay.tsx +241 -241
  73. package/lib/motion/shotcraft/upstream/demos/effects/icon-performance-moves/AttentionBounce.tsx +279 -279
  74. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/AnimeImpact.tsx +230 -230
  75. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/HitCounter.tsx +345 -345
  76. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SheenSweepRetry.tsx +275 -275
  77. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SpotlightSweepReveal.tsx +229 -229
  78. package/lib/motion/shotcraft/upstream/demos/effects/radial-ripple-phone-chips/RadialRipplePhoneChips.tsx +312 -312
  79. package/lib/motion/shotcraft/upstream/demos/effects/riso-print-hits/RisoMisregistrationHit.tsx +222 -222
  80. package/lib/motion/shotcraft/upstream/demos/effects/scan-bracket-sweep/ScanBracketSweep.tsx +295 -295
  81. package/lib/motion/shotcraft/upstream/demos/effects/scanline-annotate-focus/ScanlineAnnotateFocus.tsx +329 -329
  82. package/lib/motion/shotcraft/upstream/demos/effects/scanline-assemble-flyin/ScanlineAssembleFlyin.tsx +315 -315
  83. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ImpactBurstKit.tsx +264 -264
  84. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/KanadaPerspectiveSnap.tsx +260 -260
  85. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ScoreSlam.tsx +263 -263
  86. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/CornerSpotlightReveal.tsx +123 -123
  87. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +187 -187
  88. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/SlideSpotlightPan.tsx +175 -175
  89. package/lib/motion/shotcraft/upstream/demos/interaction/autolayout-gap-dial/AutolayoutGapDial.tsx +305 -305
  90. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/DiagramCascadeBuild.tsx +350 -350
  91. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +352 -352
  92. package/lib/motion/shotcraft/upstream/demos/interaction/chip-grid-single-select-blackout/ChipGridSingleSelectBlackout.tsx +218 -218
  93. package/lib/motion/shotcraft/upstream/demos/interaction/collab-cursor-moves/CursorCastEnsemble.tsx +297 -297
  94. package/lib/motion/shotcraft/upstream/demos/interaction/glass-pill-dictation-typing/GlassPillDictationTyping.tsx +157 -157
  95. package/lib/motion/shotcraft/upstream/demos/interaction/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +218 -218
  96. package/lib/motion/shotcraft/upstream/demos/interaction/picker-carousel-feature-cycle/PickerCarouselFeatureCycle.tsx +202 -202
  97. package/lib/motion/shotcraft/upstream/demos/interaction/segmented-thumb-hero/SegmentedThumbHero.tsx +265 -265
  98. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/PaletteThemeRipple.tsx +457 -457
  99. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/ThemeSweepToggle.tsx +446 -446
  100. package/lib/motion/shotcraft/upstream/demos/interaction/type-and-filter/TypeAndFilter.tsx +249 -249
  101. package/lib/motion/shotcraft/upstream/demos/interaction/voice-waveform-live/VoiceWaveformLive.tsx +278 -278
  102. package/lib/motion/shotcraft/upstream/demos/opening/crane-rise-reveal/CraneRiseReveal.tsx +332 -332
  103. package/lib/motion/shotcraft/upstream/demos/opening/dataviz-landscape-open/DatavizLandscapeOpen.tsx +358 -358
  104. package/lib/motion/shotcraft/upstream/demos/opening/fracture/Fracture.tsx +201 -201
  105. package/lib/motion/shotcraft/upstream/demos/opening/icon-field-colorize/IconFieldColorize.tsx +200 -200
  106. package/lib/motion/shotcraft/upstream/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx +208 -208
  107. package/lib/motion/shotcraft/upstream/demos/opening/magician-card-flourish/MagicianCardFlourish.tsx +341 -341
  108. package/lib/motion/shotcraft/upstream/demos/opening/orbit-ring-title-open/OrbitRingTitleOpen.tsx +389 -389
  109. package/lib/motion/shotcraft/upstream/demos/opening/spotlight-hero-card/SpotlightHeroCard.tsx +293 -293
  110. package/lib/motion/shotcraft/upstream/demos/opening/stroke-segment-build/StrokeSegmentBuild.tsx +183 -183
  111. package/lib/motion/shotcraft/upstream/demos/opening/text-as-mask/TextAsMask.tsx +245 -245
  112. package/lib/motion/shotcraft/upstream/demos/outro/grain-dissolve/GrainDissolve.tsx +222 -222
  113. package/lib/motion/shotcraft/upstream/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx +223 -223
  114. package/lib/motion/shotcraft/upstream/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx +217 -217
  115. package/lib/motion/shotcraft/upstream/demos/outro/outro-group-photo-launch/OutroGroupPhotoLaunch.tsx +343 -343
  116. package/lib/motion/shotcraft/upstream/demos/outro/ui-strip-away-outro/UiStripAwayOutro.tsx +357 -357
  117. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/IconFlipBloomLogo.tsx +187 -187
  118. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/InputMorphsIntoLogo.tsx +333 -333
  119. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-cut-moves/PaparazziFlash.tsx +274 -274
  120. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +270 -270
  121. package/lib/motion/shotcraft/upstream/demos/rhythm/panel-grid-moves/ComicPanelSplit.tsx +430 -430
  122. package/lib/motion/shotcraft/upstream/demos/rhythm/quad-split-parallel-scenes/QuadSplitParallelScenes.tsx +252 -252
  123. package/lib/motion/shotcraft/upstream/demos/rhythm/rhythm-interrupt-moves/JumpCutPunchIn.tsx +106 -106
  124. package/lib/motion/shotcraft/upstream/demos/rhythm/sakuga-timing-shift/SakugaTimingShift.tsx +288 -288
  125. package/lib/motion/shotcraft/upstream/demos/rhythm/speed-ramp-freeze/FreezeAnnotateReal.tsx +362 -362
  126. package/lib/motion/shotcraft/upstream/demos/rhythm/trailer-grammar-moves/TrailerBumper.tsx +168 -168
  127. package/lib/motion/shotcraft/upstream/demos/transition/bottom-push-stack-wipe/BottomPushStackWipe.tsx +310 -310
  128. package/lib/motion/shotcraft/upstream/demos/transition/card-flip-reveal/CardFlipReveal.tsx +261 -261
  129. package/lib/motion/shotcraft/upstream/demos/transition/card-flock-tumble/CardFlockTumble.tsx +459 -459
  130. package/lib/motion/shotcraft/upstream/demos/transition/circle-match-iris/CircleMatchIris.tsx +294 -294
  131. package/lib/motion/shotcraft/upstream/demos/transition/gradient-transition/GradientTransition.tsx +161 -161
  132. package/lib/motion/shotcraft/upstream/demos/transition/line-carry-transition/LineCarryTransition.tsx +248 -248
  133. package/lib/motion/shotcraft/upstream/demos/transition/mosaic-reframe/MosaicReframe.tsx +359 -359
  134. package/lib/motion/shotcraft/upstream/demos/transition/page-turn-transitions/BarnDoorSplit.tsx +227 -227
  135. package/lib/motion/shotcraft/upstream/demos/transition/print-texture-transitions/InkBleedReveal.tsx +162 -162
  136. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/PortalWipeV2.tsx +248 -248
  137. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/WhipBrakeReal.tsx +186 -186
  138. package/lib/motion/shotcraft/upstream/demos/transition/tear-streak-transitions/GlitchDisplace.tsx +355 -355
  139. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/InvisibleCut.tsx +272 -272
  140. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/LightLeakBurn.tsx +262 -262
  141. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/VersusSlam.tsx +217 -217
  142. package/lib/motion/shotcraft/upstream/demos/transition/transition-travel/LetterformZoom.tsx +285 -285
  143. package/lib/motion/shotcraft/upstream/demos/transition/white-flash-logo-simplify-cut/WhiteFlashLogoSimplifyCut.tsx +205 -205
  144. package/lib/motion/shotcraft/upstream/demos/transition/wipe-transitions/BlindsSlice.tsx +178 -178
  145. package/lib/motion/shotcraft/upstream/demos/typography/blur-slide/BlurSlide.tsx +147 -147
  146. package/lib/motion/shotcraft/upstream/demos/typography/brace-expand/BraceExpand.tsx +143 -143
  147. package/lib/motion/shotcraft/upstream/demos/typography/brand-ink-open/BrandInkOpen.tsx +134 -134
  148. package/lib/motion/shotcraft/upstream/demos/typography/countdown-arc-scatter/CountdownArcScatter.tsx +217 -217
  149. package/lib/motion/shotcraft/upstream/demos/typography/flying-words/FlyingWords.tsx +198 -198
  150. package/lib/motion/shotcraft/upstream/demos/typography/glitch-cycle/GlitchCycle.tsx +221 -221
  151. package/lib/motion/shotcraft/upstream/demos/typography/gradient-word-sweep/GradientWordSweep.tsx +312 -312
  152. package/lib/motion/shotcraft/upstream/demos/typography/lead-word-zoom-assemble/LeadWordZoomAssemble.tsx +261 -261
  153. package/lib/motion/shotcraft/upstream/demos/typography/marker-underline-title/MarkerUnderlineTitle.tsx +121 -121
  154. package/lib/motion/shotcraft/upstream/demos/typography/outline-word-fill/OutlineWordFill.tsx +153 -153
  155. package/lib/motion/shotcraft/upstream/demos/typography/paper-title-card/PaperTitleCard.tsx +179 -179
  156. package/lib/motion/shotcraft/upstream/demos/typography/pill-chip-slot-cycle-handled/PillChipSlotCycleHandled.tsx +140 -140
  157. package/lib/motion/shotcraft/upstream/demos/typography/pill-slot-cycle/PillSlotCycle.tsx +309 -309
  158. package/lib/motion/shotcraft/upstream/demos/typography/text-column-converge/TextColumnConverge.tsx +191 -191
  159. package/lib/motion/shotcraft/upstream/demos/typography/title-demote-to-label/TitleDemoteToLabel.tsx +292 -292
  160. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/LetterformDriftAssembly.tsx +135 -135
  161. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/SplitTextStagger.tsx +124 -124
  162. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/TextOnPath.tsx +255 -255
  163. package/lib/motion/shotcraft/upstream/demos/typography/type-entrance-moves/LetterDropPhysics.tsx +173 -173
  164. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/FontWeightPump.tsx +225 -225
  165. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/KaraokeFillSync.tsx +141 -141
  166. package/lib/motion/shotcraft/upstream/demos/typography/typewriter-moves/TypewriterErrorRetype.tsx +137 -137
  167. package/lib/motion/shotcraft/upstream/demos/typography/vertical-word-roll-blur-cycle/VerticalWordRollBlurCycle.tsx +147 -147
  168. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-filmstrip/WordRelayFilmstrip.tsx +409 -409
  169. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-geometry/WordRelayGeometry.tsx +280 -280
  170. package/lib/motion/shotcraft/upstream/demos/ui-entrance/avatar-bracket-carousel/AvatarBracketCarousel.tsx +271 -271
  171. package/lib/motion/shotcraft/upstream/demos/ui-entrance/bezier-source-converge-merge/BezierSourceConvergeMerge.tsx +385 -385
  172. package/lib/motion/shotcraft/upstream/demos/ui-entrance/card-stack/CardStack.tsx +312 -312
  173. package/lib/motion/shotcraft/upstream/demos/ui-entrance/carousel-3d/Carousel3D.tsx +303 -303
  174. package/lib/motion/shotcraft/upstream/demos/ui-entrance/clipcard-looping/ClipCardLooping.tsx +77 -77
  175. package/lib/motion/shotcraft/upstream/demos/ui-entrance/cloner-depth-echo/ClonerDepthEcho.tsx +311 -311
  176. package/lib/motion/shotcraft/upstream/demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx +307 -307
  177. package/lib/motion/shotcraft/upstream/demos/ui-entrance/doc-park-left-pill-deal/DocParkLeftPillDeal.tsx +349 -349
  178. package/lib/motion/shotcraft/upstream/demos/ui-entrance/document-typewriter-reveal/DocumentTypewriterReveal.tsx +255 -255
  179. package/lib/motion/shotcraft/upstream/demos/ui-entrance/draw-svg-trace/DrawSvgTrace.tsx +244 -244
  180. package/lib/motion/shotcraft/upstream/demos/ui-entrance/element-body-moves/ContactShadowLift.tsx +217 -217
  181. package/lib/motion/shotcraft/upstream/demos/ui-entrance/integration-hub-map/IntegrationHubMap.tsx +652 -652
  182. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-reveal/ListReveal.tsx +153 -153
  183. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-stack-press/ListStackPress.tsx +238 -238
  184. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-forerun/NeonFrameForerun.tsx +324 -324
  185. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +354 -354
  186. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/PageWaterfallWall.tsx +101 -101
  187. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/VerticalTicker.tsx +129 -129
  188. package/lib/motion/shotcraft/upstream/demos/ui-entrance/product-card-progressive-assemble/ProductCardProgressiveAssemble.tsx +297 -297
  189. package/lib/motion/shotcraft/upstream/demos/ui-entrance/radial-wave/RadialWave.tsx +57 -57
  190. package/lib/motion/shotcraft/upstream/demos/ui-entrance/research-card-stack-scroll/ResearchCardStackScroll.tsx +155 -155
  191. package/lib/motion/shotcraft/upstream/demos/ui-entrance/row-embed/RowEmbed.tsx +175 -175
  192. package/lib/motion/shotcraft/upstream/demos/ui-entrance/value-stagger-gradient/ValueStaggerGradient.tsx +153 -153
  193. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/BentoLightUp.tsx +146 -146
  194. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/WireframeDrawOn.tsx +226 -226
  195. package/lib/motion/shotcraft/upstream/gallery/api/library.json +1 -1
  196. package/lib/motion/shotcraft/upstream/references/aesthetic-rules.md +193 -193
  197. package/lib/motion/shotcraft/upstream/references/final-review.md +121 -121
  198. package/lib/motion/shotcraft/upstream/references/guided-free-creation.md +199 -199
  199. package/lib/motion/shotcraft/upstream/references/jianying-export.md +183 -183
  200. package/lib/motion/shotcraft/upstream/references/music-beat-sync.md +257 -257
  201. package/lib/motion/shotcraft/upstream/references/pipeline.md +382 -382
  202. package/lib/motion/shotcraft/upstream/references/publish-upload-post.md +111 -111
  203. package/lib/motion/shotcraft/upstream/references/sequences/promo-energy-arc.md +50 -50
  204. package/lib/motion/shotcraft/upstream/references/sfx-sourcing.md +95 -95
  205. package/lib/motion/shotcraft/upstream/references/shots/camera/basic-3d-scene.md +41 -41
  206. package/lib/motion/shotcraft/upstream/references/shots/camera/crash-zoom-punch.md +52 -52
  207. package/lib/motion/shotcraft/upstream/references/shots/camera/cursor-flyover.md +39 -39
  208. package/lib/motion/shotcraft/upstream/references/shots/camera/depth-layer-moves.md +39 -39
  209. package/lib/motion/shotcraft/upstream/references/shots/camera/graze-face-tour.md +57 -57
  210. package/lib/motion/shotcraft/upstream/references/shots/camera/overhead-camera-moves.md +51 -51
  211. package/lib/motion/shotcraft/upstream/references/shots/camera/space-camera-moves.md +46 -46
  212. package/lib/motion/shotcraft/upstream/references/shots/camera/steep-tilt-glide.md +52 -52
  213. package/lib/motion/shotcraft/upstream/references/shots/camera/tension-camera-moves.md +43 -43
  214. package/lib/motion/shotcraft/upstream/references/shots/camera/terminal-3d.md +42 -42
  215. package/lib/motion/shotcraft/upstream/references/shots/data/before-after-slider-scrub.md +48 -48
  216. package/lib/motion/shotcraft/upstream/references/shots/data/chart-live-moves.md +52 -52
  217. package/lib/motion/shotcraft/upstream/references/shots/data/gauge-readout-moves.md +45 -45
  218. package/lib/motion/shotcraft/upstream/references/shots/data/scroll-brake-moves.md +46 -46
  219. package/lib/motion/shotcraft/upstream/references/shots/data/timeline-travel.md +44 -44
  220. package/lib/motion/shotcraft/upstream/references/shots/effects/assemble-then-type-flyin.md +63 -63
  221. package/lib/motion/shotcraft/upstream/references/shots/effects/aurora-bloom-bg-flip.md +54 -54
  222. package/lib/motion/shotcraft/upstream/references/shots/effects/brand-frame-snap.md +58 -58
  223. package/lib/motion/shotcraft/upstream/references/shots/effects/fui-hud-moves.md +35 -35
  224. package/lib/motion/shotcraft/upstream/references/shots/effects/glow-flyline-moves.md +53 -53
  225. package/lib/motion/shotcraft/upstream/references/shots/effects/icon-performance-moves.md +42 -42
  226. package/lib/motion/shotcraft/upstream/references/shots/effects/impact-feedback.md +50 -50
  227. package/lib/motion/shotcraft/upstream/references/shots/effects/light-play-moves.md +46 -46
  228. package/lib/motion/shotcraft/upstream/references/shots/effects/radial-ripple-phone-chips.md +56 -56
  229. package/lib/motion/shotcraft/upstream/references/shots/effects/riso-print-hits.md +49 -49
  230. package/lib/motion/shotcraft/upstream/references/shots/effects/scan-bracket-sweep.md +50 -50
  231. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-annotate-focus.md +53 -53
  232. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-assemble-flyin.md +53 -53
  233. package/lib/motion/shotcraft/upstream/references/shots/effects/slam-entrance-moves.md +55 -55
  234. package/lib/motion/shotcraft/upstream/references/shots/effects/spotlight-sweep-moves.md +52 -52
  235. package/lib/motion/shotcraft/upstream/references/shots/interaction/autolayout-gap-dial.md +60 -60
  236. package/lib/motion/shotcraft/upstream/references/shots/interaction/canvas-materialize-moves.md +57 -57
  237. package/lib/motion/shotcraft/upstream/references/shots/interaction/chip-grid-single-select-blackout.md +51 -51
  238. package/lib/motion/shotcraft/upstream/references/shots/interaction/collab-cursor-moves.md +41 -41
  239. package/lib/motion/shotcraft/upstream/references/shots/interaction/glass-pill-dictation-typing.md +53 -53
  240. package/lib/motion/shotcraft/upstream/references/shots/interaction/hashtag-to-pill-materialize.md +60 -60
  241. package/lib/motion/shotcraft/upstream/references/shots/interaction/picker-carousel-feature-cycle.md +55 -55
  242. package/lib/motion/shotcraft/upstream/references/shots/interaction/segmented-thumb-hero.md +57 -57
  243. package/lib/motion/shotcraft/upstream/references/shots/interaction/theme-switch-moves.md +47 -47
  244. package/lib/motion/shotcraft/upstream/references/shots/interaction/type-and-filter.md +37 -37
  245. package/lib/motion/shotcraft/upstream/references/shots/interaction/voice-waveform-live.md +54 -54
  246. package/lib/motion/shotcraft/upstream/references/shots/opening/brand-ink-open.md +36 -36
  247. package/lib/motion/shotcraft/upstream/references/shots/opening/crane-rise-reveal.md +56 -56
  248. package/lib/motion/shotcraft/upstream/references/shots/opening/dataviz-landscape-open.md +56 -56
  249. package/lib/motion/shotcraft/upstream/references/shots/opening/fracture.md +40 -40
  250. package/lib/motion/shotcraft/upstream/references/shots/opening/icon-field-colorize.md +60 -60
  251. package/lib/motion/shotcraft/upstream/references/shots/opening/letterspace-materialize.md +57 -57
  252. package/lib/motion/shotcraft/upstream/references/shots/opening/magician-card-flourish.md +73 -73
  253. package/lib/motion/shotcraft/upstream/references/shots/opening/orbit-ring-title-open.md +87 -87
  254. package/lib/motion/shotcraft/upstream/references/shots/opening/spotlight-hero-card.md +55 -55
  255. package/lib/motion/shotcraft/upstream/references/shots/opening/stroke-segment-build.md +50 -50
  256. package/lib/motion/shotcraft/upstream/references/shots/opening/text-as-mask.md +59 -59
  257. package/lib/motion/shotcraft/upstream/references/shots/outro/grain-dissolve.md +38 -38
  258. package/lib/motion/shotcraft/upstream/references/shots/outro/logo-shrink-wordmark-lockup.md +38 -38
  259. package/lib/motion/shotcraft/upstream/references/shots/outro/neon-triple-marquee.md +59 -59
  260. package/lib/motion/shotcraft/upstream/references/shots/outro/outro-group-photo-launch.md +39 -39
  261. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-strip-away-outro.md +61 -61
  262. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-to-brand-morph.md +52 -52
  263. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-cut-moves.md +50 -50
  264. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-step-list-theme-cycle.md +66 -66
  265. package/lib/motion/shotcraft/upstream/references/shots/rhythm/panel-grid-moves.md +43 -43
  266. package/lib/motion/shotcraft/upstream/references/shots/rhythm/quad-split-parallel-scenes.md +38 -38
  267. package/lib/motion/shotcraft/upstream/references/shots/rhythm/rhythm-interrupt-moves.md +38 -38
  268. package/lib/motion/shotcraft/upstream/references/shots/rhythm/sakuga-timing-shift.md +56 -56
  269. package/lib/motion/shotcraft/upstream/references/shots/rhythm/speed-ramp-freeze.md +44 -44
  270. package/lib/motion/shotcraft/upstream/references/shots/rhythm/trailer-grammar-moves.md +38 -38
  271. package/lib/motion/shotcraft/upstream/references/shots/transition/bottom-push-stack-wipe.md +63 -63
  272. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flip-reveal.md +57 -57
  273. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flock-tumble.md +63 -63
  274. package/lib/motion/shotcraft/upstream/references/shots/transition/circle-match-iris.md +58 -58
  275. package/lib/motion/shotcraft/upstream/references/shots/transition/gradient-transition.md +45 -45
  276. package/lib/motion/shotcraft/upstream/references/shots/transition/line-carry-transition.md +55 -55
  277. package/lib/motion/shotcraft/upstream/references/shots/transition/mosaic-reframe.md +49 -49
  278. package/lib/motion/shotcraft/upstream/references/shots/transition/page-turn-transitions.md +42 -42
  279. package/lib/motion/shotcraft/upstream/references/shots/transition/print-texture-transitions.md +42 -42
  280. package/lib/motion/shotcraft/upstream/references/shots/transition/shot-transitions.md +45 -45
  281. package/lib/motion/shotcraft/upstream/references/shots/transition/tear-streak-transitions.md +48 -48
  282. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-hidden-cut.md +55 -55
  283. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-travel.md +43 -43
  284. package/lib/motion/shotcraft/upstream/references/shots/transition/white-flash-logo-simplify-cut.md +41 -41
  285. package/lib/motion/shotcraft/upstream/references/shots/transition/wipe-transitions.md +42 -42
  286. package/lib/motion/shotcraft/upstream/references/shots/typography/blur-slide.md +59 -59
  287. package/lib/motion/shotcraft/upstream/references/shots/typography/brace-expand.md +55 -55
  288. package/lib/motion/shotcraft/upstream/references/shots/typography/countdown-arc-scatter.md +65 -65
  289. package/lib/motion/shotcraft/upstream/references/shots/typography/document-typewriter-reveal.md +42 -42
  290. package/lib/motion/shotcraft/upstream/references/shots/typography/flying-words.md +64 -64
  291. package/lib/motion/shotcraft/upstream/references/shots/typography/glitch-cycle.md +64 -64
  292. package/lib/motion/shotcraft/upstream/references/shots/typography/gradient-word-sweep.md +54 -54
  293. package/lib/motion/shotcraft/upstream/references/shots/typography/lead-word-zoom-assemble.md +91 -91
  294. package/lib/motion/shotcraft/upstream/references/shots/typography/marker-underline-title.md +51 -51
  295. package/lib/motion/shotcraft/upstream/references/shots/typography/outline-word-fill.md +66 -66
  296. package/lib/motion/shotcraft/upstream/references/shots/typography/paper-title-card.md +38 -38
  297. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-chip-slot-cycle-handled.md +66 -66
  298. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-slot-cycle.md +58 -58
  299. package/lib/motion/shotcraft/upstream/references/shots/typography/text-column-converge.md +61 -61
  300. package/lib/motion/shotcraft/upstream/references/shots/typography/title-demote-to-label.md +64 -64
  301. package/lib/motion/shotcraft/upstream/references/shots/typography/type-assembly-moves.md +45 -45
  302. package/lib/motion/shotcraft/upstream/references/shots/typography/type-entrance-moves.md +41 -41
  303. package/lib/motion/shotcraft/upstream/references/shots/typography/type-rhythm-sync.md +51 -51
  304. package/lib/motion/shotcraft/upstream/references/shots/typography/typewriter-moves.md +42 -42
  305. package/lib/motion/shotcraft/upstream/references/shots/typography/vertical-word-roll-blur-cycle.md +63 -63
  306. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-filmstrip.md +57 -57
  307. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-geometry.md +75 -75
  308. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/avatar-bracket-carousel.md +59 -59
  309. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/bezier-source-converge-merge.md +67 -67
  310. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/card-stack.md +60 -60
  311. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/carousel-3d.md +66 -66
  312. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/cloner-depth-echo.md +40 -40
  313. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/deck-deal-flyin.md +45 -45
  314. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/doc-park-left-pill-deal.md +62 -62
  315. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/draw-svg-trace.md +55 -55
  316. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/element-body-moves.md +37 -37
  317. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/integration-hub-map.md +55 -55
  318. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-reveal.md +50 -50
  319. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-stack-press.md +43 -43
  320. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-forerun.md +55 -55
  321. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-orbit-drop.md +51 -51
  322. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/page-waterfall-wall.md +51 -51
  323. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/product-card-progressive-assemble.md +56 -56
  324. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/radial-wave.md +49 -49
  325. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/research-card-stack-scroll.md +57 -57
  326. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/row-embed.md +36 -36
  327. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/value-stagger-gradient.md +64 -64
  328. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/wall-reveal-moves.md +47 -47
  329. package/lib/motion/shotcraft/upstream/references/sound-design.md +170 -170
  330. package/lib/motion/shotcraft/upstream/references/workbench.md +157 -157
  331. package/lib/motion/shotcraft/upstream/template/TEMPLATE.md +103 -103
  332. package/lib/motion/shotcraft/upstream/template/THEMES.md +44 -44
  333. package/lib/motion/shotcraft/upstream/template/package.json +20 -20
  334. package/lib/motion/shotcraft/upstream/template/remotion.config.ts +6 -6
  335. package/lib/motion/shotcraft/upstream/template/src/Root.tsx +17 -17
  336. package/lib/motion/shotcraft/upstream/template/src/aifl/Caption.tsx +65 -65
  337. package/lib/motion/shotcraft/upstream/template/src/aifl/DigitRoll.tsx +48 -48
  338. package/lib/motion/shotcraft/upstream/template/src/aifl/FlashCut.tsx +24 -24
  339. package/lib/motion/shotcraft/upstream/template/src/aifl/Main.tsx +192 -192
  340. package/lib/motion/shotcraft/upstream/template/src/aifl/PaperTitleCard.tsx +111 -111
  341. package/lib/motion/shotcraft/upstream/template/src/aifl/live/PageCam.tsx +150 -150
  342. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneDetail.tsx +158 -158
  343. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneFlyIn.tsx +468 -468
  344. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOpen.tsx +552 -552
  345. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOutroLive.tsx +411 -411
  346. package/lib/motion/shotcraft/upstream/template/src/aifl/live/ScenePapers.tsx +200 -200
  347. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneWbr.tsx +324 -324
  348. package/lib/motion/shotcraft/upstream/template/src/aifl/live-layout.json +388 -388
  349. package/lib/motion/shotcraft/upstream/template/src/index.ts +4 -4
  350. package/lib/motion/shotcraft/upstream/template/src/themes/ThemedFilm.tsx +7 -7
  351. package/lib/motion/shotcraft/upstream/template/src/themes/manifest.tsx +68 -68
  352. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.json +1 -1
  353. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.ts +24 -24
  354. package/lib/motion/shotcraft/upstream/template/src/themes/palettes.json +74 -74
  355. package/lib/motion/shotcraft/upstream/template/src/themes/visual-theme.tsx +91 -91
  356. package/lib/motion/shotcraft/upstream/template/src/workbench.ts +213 -213
  357. package/lib/motion/shotcraft/upstream/template/tsconfig.json +15 -15
  358. package/lib/motion/style-frames.js +47 -12
  359. package/lib/motion-project.js +22 -3
  360. package/lib/motion-render-worker.js +31 -9
  361. package/lib/routing/router.js +12 -1
  362. package/lib/style-kernel.js +16 -6
  363. package/lib/video-trace-pool.js +128 -128
  364. package/package.json +1 -1
  365. package/LICENSE +0 -4175
@@ -1,366 +1,366 @@
1
- // steep-tilt-glide v5(批次 14 #2)。用户意见(逐字):
2
- // "角度不对,你看看原片这个镜头的角度;以及镜头是固定的,但是页面本身
3
- // 往其3d空间的横面方向移动的效果"
4
- // ——两点落实:①角度对照原片密帧校准(右缘近、左缘远的陡峭 rotateY,
5
- // 顶缘向右上扬、透视灭点在左中下);②运动模型改"物动镜不动":
6
- // perspective / perspectiveOrigin / rotateY / rotateZ 全程一个常数不动,
7
- // 动的只有页面自身沿其 3D 平面横向(局部 X 轴)的滑移 translateX。
8
- // v4 的悬空贴落(FloatWrap 同形软影)保留。
9
- //
10
- // 质感改版(镜头常数 / 滑移曲线 / 贴落节拍全部不动):字体换系统栈 + 按字号的字距;
11
- // 同形软影加大虚化、压低不透明度——读作影子而不是一份重叠的字;速度重影从两层
12
- // 离散拷贝改为三层更密的拖尾(f-1.6/-3.2/-4.8,权重递减),读作拖影而不是双影;
13
- // 主区空白圆角砖填入克制的小组件内容;右段白页加发丝边与投影分层;屏幕空间
14
- // 左侧景深雾 + 颗粒,远端更沉、近端更亮,强化 60° 斜墙的纵深。
15
- import React from 'react';
16
- import { AbsoluteFill, interpolate, useCurrentFrame, Easing } from 'remotion';
17
- import { FONT as PFONT, Grain } from '../../_fixtures/Polish';
18
- import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
19
-
20
- const FONT = PFONT.sans;
21
- const INK = '#2a2a31';
22
-
23
- const easeFall = Easing.bezier(0.5, 0.05, 0.6, 1); // 加速贴落、末端软着陆
24
-
25
- /* 悬浮 + 同形软影(GrazeFaceTour FloatWrap 模式) */
26
- const FloatWrap: React.FC<{ h: number; children: React.ReactNode }> = ({ h, children }) => (
27
- <div style={{ position: 'relative' }}>
28
- {h > 2 && (
29
- <div style={{
30
- position: 'absolute', inset: 0,
31
- transform: `translate(${h * 0.24}px, ${h * 0.46}px) scale(${1 + h * 0.0012})`,
32
- // 影子要读作"影":随高度更虚、更淡,压成无字形的冷灰团(不再是一份可读的重叠字)
33
- filter: `blur(${9 + h * 0.13}px) brightness(0.2) saturate(0)`,
34
- opacity: Math.min(0.26, 0.1 + h * 0.0011),
35
- pointerEvents: 'none',
36
- }}>{children}</div>
37
- )}
38
- <div style={{ transform: `translate(${-h * 0.34}px, ${-h * 0.8}px)` }}>{children}</div>
39
- </div>
40
- );
41
-
42
- /* land=贴合完成时刻(0..1),之前从 H 高度加速贴落 */
43
- const liftOf = (t: number, land: number, H = 230) => {
44
- const FALL = 0.32;
45
- const p = Math.min(1, Math.max(0, (t - (land - FALL)) / FALL));
46
- return (1 - easeFall(p)) * H;
47
- };
48
-
49
- /* 主区圆角灰砖里的图标:场记板(镜头 / 分镜的通用符号,取代原片的第三方 logo) */
50
- const ClapperGlyph: React.FC<{ size: number }> = ({ size }) => (
51
- <svg width={size} height={size} viewBox="0 0 100 100">
52
- {/* 拍板:墨色条 + 琥珀斜纹 */}
53
- <g transform="rotate(-12 10 34)">
54
- <rect x={10} y={20} width={80} height={16} rx={3} fill={BRAND.ink} />
55
- {[0, 1, 2, 3].map((i) => (
56
- <path key={i} d={`M ${18 + i * 19} 36 L ${28 + i * 19} 20 L ${36 + i * 19} 20 L ${26 + i * 19} 36 Z`} fill={BRAND.amber} />
57
- ))}
58
- </g>
59
- {/* 板身 */}
60
- <rect x={10} y={40} width={80} height={46} rx={6} fill={BRAND.ink} />
61
- <rect x={20} y={54} width={34} height={6} rx={3} fill={BRAND.paper} opacity={0.85} />
62
- <rect x={20} y={68} width={52} height={6} rx={3} fill={BRAND.paper} opacity={0.5} />
63
- </svg>
64
- );
65
-
66
- /* 主区小组件:三张白砖各一种(进度 / 待办 / 走势),内容坐标同页面(6200 宽体系) */
67
- const MiniWidget: React.FC<{ kind: number }> = ({ kind }) => {
68
- const title = ['Render queue', 'Shot list', 'Renders'][kind];
69
- return (
70
- <div style={{ fontFamily: FONT, color: INK }}>
71
- <div style={{ display: 'flex', alignItems: 'center', gap: 22 }}>
72
- <div style={{ width: 22, height: 22, borderRadius: 7, background: ['#7b68ee', '#e33bc6', '#49b8f9'][kind] }} />
73
- <div style={{ fontSize: 46, fontWeight: 600, letterSpacing: '-0.015em' }}>{title}</div>
74
- </div>
75
- {kind === 0 && (
76
- <>
77
- <div style={{ marginTop: 40, fontSize: 120, fontWeight: 700, letterSpacing: '-0.04em', lineHeight: 1, fontVariantNumeric: 'tabular-nums' }}>72%</div>
78
- <div style={{ marginTop: 34, height: 22, borderRadius: 11, background: '#ececf2' }}>
79
- <div style={{ width: '72%', height: '100%', borderRadius: 11, background: 'linear-gradient(90deg, #7b68ee, #9b8cff)' }} />
80
- </div>
81
- </>
82
- )}
83
- {kind === 1 && (
84
- <div style={{ marginTop: 36, display: 'flex', flexDirection: 'column', gap: 30 }}>
85
- {[['Storyboard', 'Mon'], ['Sound design', 'Wed'], ['Final render', 'Fri']].map(([n, d], j) => (
86
- <div key={n} style={{ display: 'flex', alignItems: 'center', gap: 24, fontSize: 40 }}>
87
- <div style={{ width: 30, height: 30, borderRadius: 9, border: '4px solid #c9c9d4', boxSizing: 'border-box', background: j === 0 ? '#e33bc6' : 'transparent', borderColor: j === 0 ? '#e33bc6' : '#c9c9d4' }} />
88
- <span style={{ color: j === 0 ? '#9a9aa6' : INK, textDecoration: j === 0 ? 'line-through' : 'none' }}>{n}</span>
89
- <span style={{ marginLeft: 'auto', color: '#9a9aa6', fontSize: 34 }}>{d}</span>
90
- </div>
91
- ))}
92
- </div>
93
- )}
94
- {kind === 2 && (
95
- <svg width={440} height={150} viewBox="0 0 440 150" style={{ marginTop: 34, display: 'block' }}>
96
- <path d="M0 120 C 50 110, 70 70, 120 78 S 200 120, 250 72 S 340 30, 440 18" fill="none" stroke="#49b8f9" strokeWidth={8} strokeLinecap="round" />
97
- <path d="M0 120 C 50 110, 70 70, 120 78 S 200 120, 250 72 S 340 30, 440 18 V 150 H 0 Z" fill="rgba(73,184,249,0.12)" />
98
- </svg>
99
- )}
100
- </div>
101
- );
102
- };
103
-
104
- /* 页面:宽 6200 —— 左段=video-shotcraft 顶栏+侧栏(版式对齐原片用户截图三张),
105
- 右段=原片后程滑入的图标砖、大 W 字、Launch film shots 列表 */
106
- const PW = 6200;
107
- const PH = 2400;
108
-
109
- const Panel: React.FC<{ shade: number; t?: number }> = ({ shade, t = 1 }) => (
110
- <div style={{
111
- width: PW, height: PH, background: '#f4f4f6', borderRadius: 64,
112
- position: 'relative', overflow: 'hidden',
113
- boxShadow: '0 0 220px rgba(220,210,255,0.35)',
114
- fontFamily: FONT,
115
- }}>
116
- {/* 顶部 tab 条(贯穿整页;文字悬空贴落) */}
117
- <div style={{
118
- position: 'absolute', top: 0, left: 0, width: PW, height: 230,
119
- borderBottom: '4px solid #dcdce2', display: 'flex', alignItems: 'center', paddingLeft: 130,
120
- }}>
121
- <FloatWrap h={liftOf(t, 0.3)}>
122
- <div style={{ display: 'flex', alignItems: 'center' }}>
123
- <svg width={58} height={58} viewBox="0 0 40 40" style={{ marginRight: 34 }}>
124
- {[[4, 4], [23, 4], [4, 23], [23, 23]].map(([x, y], i) => (
125
- <rect key={i} x={x} y={y} width={13} height={13} rx={3} fill="none" stroke="#4a4a52" strokeWidth={3.5} />
126
- ))}
127
- </svg>
128
- <div style={{ fontSize: 66, color: INK, fontWeight: 500, letterSpacing: '-0.01em' }}>Shot recipes</div>
129
- </div>
130
- </FloatWrap>
131
- <FloatWrap h={liftOf(t, 0.42, 280)}>
132
- <div style={{ display: 'flex', alignItems: 'center' }}>
133
- {/* 标题前的品牌方块 → video-shotcraft 标志;标题字标全小写 */}
134
- <ShotcraftMark size={150} tone="light" style={{ marginLeft: 110, flexShrink: 0 }} />
135
- <div style={{ fontSize: 165, color: '#222228', fontWeight: 600, marginLeft: 70, letterSpacing: '-0.035em', whiteSpace: 'nowrap', fontFamily: BRAND.font }}>{BRAND.name}</div>
136
- </div>
137
- </FloatWrap>
138
- {/* 顶栏右延的淡 tab(版式对齐原片 clickup04 顶栏) */}
139
- {[['Launch storyboard', 3050], ['Camera moves', 3900], ['Renders', 4650]].map(([tb, x]) => (
140
- <div key={tb as string} style={{ position: 'absolute', left: x as number, top: 88, fontSize: 58, color: '#8d8d96' }}>{tb}</div>
141
- ))}
142
- </div>
143
- {/* 工作区 logo 行:video-shotcraft 标志 + 简称 */}
144
- <div style={{ position: 'absolute', left: 120, top: 560 }}>
145
- <FloatWrap h={liftOf(t, 0.54, 250)}>
146
- <div style={{ display: 'flex', alignItems: 'center', gap: 26 }}>
147
- <ShotcraftMark size={104} tone="light" />
148
- <div style={{ fontSize: 92, fontWeight: 750, color: '#222228', letterSpacing: '-0.03em', fontFamily: BRAND.font }}>{BRAND.short}</div>
149
- </div>
150
- </FloatWrap>
151
- </div>
152
- {/* 主区圆角灰砖:场记板图标 + 下拉 chevron(原片 f45–f60) */}
153
- <div style={{ position: 'absolute', left: 1330, top: 440 }}>
154
- <FloatWrap h={liftOf(t, 0.62, 260)}>
155
- <div style={{
156
- width: 620, height: 350, background: '#ebebef', borderRadius: 56,
157
- display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 60,
158
- }}>
159
- <div style={{
160
- width: 210, height: 210, background: '#fdfdfe', borderRadius: 44,
161
- boxShadow: '0 6px 60px rgba(180,180,200,0.35)',
162
- display: 'flex', alignItems: 'center', justifyContent: 'center',
163
- }}>
164
- <ClapperGlyph size={130} />
165
- </div>
166
- <svg width={90} height={90} viewBox="0 0 40 40">
167
- <path d="M 10 15 L 20 26 L 30 15" fill="none" stroke="#6a6a74" strokeWidth={3.6} strokeLinecap="round" strokeLinejoin="round" />
168
- </svg>
169
- </div>
170
- </FloatWrap>
171
- </div>
172
- {/* Home 宽药丸(紫边细线横贯面板) */}
173
- <div style={{ position: 'absolute', left: 110, top: 830, width: 2900 }}>
174
- <FloatWrap h={liftOf(t, 0.68, 260)}>
175
- <div style={{
176
- width: 2900, height: 168,
177
- borderRadius: 34, border: '3.5px solid rgba(118,108,238,0.75)',
178
- background: 'rgba(122,110,240,0.09)', display: 'flex', alignItems: 'center',
179
- gap: 40, paddingLeft: 56, boxSizing: 'border-box',
180
- }}>
181
- <svg width={66} height={66} viewBox="0 0 40 40">
182
- <path d="M 6 20 L 20 7 L 34 20 M 11 17 V 33 H 29 V 17" fill="none" stroke="#5a5ad2" strokeWidth={3.4} strokeLinecap="round" strokeLinejoin="round" />
183
- </svg>
184
- <div style={{ fontSize: 70, color: '#5353cf', fontWeight: 550 }}>Home</div>
185
- </div>
186
- </FloatWrap>
187
- </div>
188
- {/* Inbox 行 */}
189
- <div style={{ position: 'absolute', left: 166, top: 1070 }}>
190
- <FloatWrap h={liftOf(t, 0.8, 240)}>
191
- <div style={{ display: 'flex', alignItems: 'center', gap: 40 }}>
192
- <svg width={64} height={64} viewBox="0 0 40 40">
193
- <path d="M 20 5 C 13 5 10 10 10 16 V 24 L 6 30 H 34 L 30 24 V 16 C 30 10 27 5 20 5 Z M 16 33 C 16 36 24 36 24 33"
194
- fill="none" stroke="#3a3a42" strokeWidth={3} strokeLinecap="round" strokeLinejoin="round" />
195
- </svg>
196
- <div style={{ fontSize: 70, color: INK }}>Inbox</div>
197
- </div>
198
- </FloatWrap>
199
- </div>
200
- {/* 更多侧栏行 */}
201
- {['Docs', 'Dashboards'].map((tb, i) => (
202
- <div key={tb} style={{ position: 'absolute', left: 166, top: 1310 + i * 240 }}>
203
- <FloatWrap h={liftOf(t, 0.86 + i * 0.06, 230)}>
204
- <div style={{ display: 'flex', alignItems: 'center', gap: 40 }}>
205
- <div style={{ width: 58, height: 58, border: '6px solid #8f8f98', borderRadius: 14 }} />
206
- <div style={{ fontSize: 70, color: INK }}>{tb}</div>
207
- </div>
208
- </FloatWrap>
209
- </div>
210
- ))}
211
- {/* 主区轮播左箭头(原片 f60 中景的 "<") */}
212
- <div style={{ position: 'absolute', left: 2440, top: 1060 }}>
213
- <svg width={120} height={120} viewBox="0 0 40 40">
214
- <path d="M 26 6 L 12 20 L 26 34" fill="none" stroke="#2c2c33" strokeWidth={4.4} strokeLinecap="round" strokeLinejoin="round" />
215
- </svg>
216
- </div>
217
- {/* 大 W 字形(原片中程右上滑入的大字残段) */}
218
- <div style={{ position: 'absolute', left: 3050, top: 300, fontSize: 430, fontWeight: 700, color: '#232329', letterSpacing: '-0.04em' }}>W</div>
219
- {/* 主区白色圆角卡群(右下白砖):填入克制的小组件内容,不再是空白块 */}
220
- {[[2620, 620, 640, 380], [2740, 1360, 720, 420], [2620, 1900, 560, 330]].map(([x, y, w, h], i) => (
221
- <div key={i} style={{
222
- position: 'absolute', left: x, top: y, width: w, height: h, boxSizing: 'border-box',
223
- background: 'linear-gradient(180deg, #ffffff 0%, #f9f9fb 100%)', borderRadius: 56,
224
- border: '3px solid rgba(28,28,40,0.05)',
225
- boxShadow: 'inset 0 4px 0 rgba(255,255,255,0.9), 0 8px 24px rgba(150,150,175,0.16), 0 40px 90px -30px rgba(120,120,150,0.32)',
226
- padding: '52px 60px', overflow: 'hidden',
227
- }}>
228
- <MiniWidget kind={i} />
229
- </div>
230
- ))}
231
- {/* —— 右段:Launch film shots 列表(原片尾程满幅白页) —— */}
232
- <div style={{
233
- position: 'absolute', left: 3560, top: 230, width: PW - 3560, height: PH - 230,
234
- background: 'linear-gradient(180deg, #fdfdfe 0%, #f9f9fb 100%)',
235
- // 发丝边 + 左侧投影:白页叠在主区之上,而不是一条生硬的色块分界
236
- boxShadow: '-3px 0 0 rgba(28,28,40,0.06), -40px 0 90px -20px rgba(110,110,140,0.22)',
237
- }}>
238
- <div style={{ position: 'absolute', left: 220, top: 200, fontSize: 150, fontWeight: 700, color: '#1f1f25', letterSpacing: '-0.035em', whiteSpace: 'nowrap' }}>Launch film shots</div>
239
- {/* List / Board tabs */}
240
- <div style={{ position: 'absolute', left: 240, top: 480, display: 'flex', gap: 110, alignItems: 'center' }}>
241
- <div style={{
242
- display: 'flex', alignItems: 'center', gap: 26, background: '#ececf1',
243
- borderRadius: 22, padding: '20px 40px',
244
- }}>
245
- <svg width={56} height={56} viewBox="0 0 40 40">
246
- {[9, 20, 31].map((y) => (
247
- <g key={y}>
248
- <rect x={5} y={y - 1.6} width={4} height={4} fill="#3a3a42" />
249
- <rect x={14} y={y - 1.4} width={20} height={3.4} rx={1.6} fill="#3a3a42" />
250
- </g>
251
- ))}
252
- </svg>
253
- <div style={{ fontSize: 62, fontWeight: 600, color: '#2c2c33' }}>List</div>
254
- </div>
255
- <div style={{ display: 'flex', alignItems: 'center', gap: 26 }}>
256
- <svg width={56} height={56} viewBox="0 0 40 40">
257
- <rect x={5} y={7} width={12} height={26} rx={3} fill="none" stroke="#3a3a42" strokeWidth={3} />
258
- <rect x={23} y={7} width={12} height={18} rx={3} fill="none" stroke="#3a3a42" strokeWidth={3} />
259
- </svg>
260
- <div style={{ fontSize: 62, fontWeight: 500, color: '#2c2c33' }}>Board</div>
261
- </div>
262
- <div style={{ fontSize: 56, color: '#9a9aa4', marginLeft: -40 }}>11</div>
263
- </div>
264
- <div style={{ position: 'absolute', left: 900, top: 620, width: 1500, height: 3, background: '#e4e4ea' }} />
265
- {/* IN PROGRESS chip */}
266
- <div style={{
267
- position: 'absolute', left: 240, top: 850, background: '#fce4f5', color: '#c93bb0',
268
- fontSize: 46, fontWeight: 650, letterSpacing: '0.06em', padding: '14px 30px', borderRadius: 14,
269
- }}>IN PROGRESS</div>
270
- <div style={{ position: 'absolute', left: 244, top: 1030, fontSize: 44, fontWeight: 600, color: '#8f8f98', letterSpacing: '0.08em' }}>SHOT NAME</div>
271
- {/* 任务行 */}
272
- {[['Crash zoom opener', '#3a3a42'], ['Steep tilt glide', '#55555e'], ['Beat-synced cuts', '#83838d'], ['Logo sting', '#b3b3bc']].map(([name, col], i) => (
273
- <div key={name as string} style={{ position: 'absolute', left: 280, top: 1180 + i * 210, display: 'flex', alignItems: 'center', gap: 56 }}>
274
- <div style={{ width: 42, height: 42, borderRadius: 12, background: '#e33bc6' }} />
275
- <div style={{ fontSize: 64, fontWeight: 550, color: col as string, whiteSpace: 'nowrap' }}>{name}</div>
276
- </div>
277
- ))}
278
- </div>
279
- {/* 亮度:面板内黑罩(随进度揭亮) */}
280
- <div style={{ position: 'absolute', inset: 0, background: '#050409', opacity: shade }} />
281
- {/* 左缘额外阴影(起始更暗,随亮度一同退去) */}
282
- <div style={{
283
- position: 'absolute', inset: 0,
284
- background: 'linear-gradient(90deg, rgba(5,4,9,0.9), rgba(5,4,9,0) 42%)',
285
- opacity: Math.min(1, shade * 1.6),
286
- }} />
287
- </div>
288
- );
289
-
290
- /* 固定镜头 + 页面沿自身平面横向滑移。
291
- * 镜头常数(对照原片密帧校准):perspective 1150、origin 24% 62%、
292
- * rotateY(-38°)(右缘近、左缘远,顶缘向右上扬)+ rotateZ(-2°)。
293
- * lx = 页面局部 X 平移(页面自己的横面方向),全程唯一动的量 */
294
- // v7(批次 16):用户意见"改成60度吧"——rotY -53 → -60(精确定值)
295
- const CAM = { persp: 1100, origin: '30% 58%', rotY: -60, rotZ: -2, left: '40%', top: '15%', scale: 0.62 };
296
-
297
- const PanelLayer: React.FC<{ lx: number; shade: number; opacity: number; t: number }> = ({ lx, shade, opacity, t }) => (
298
- <AbsoluteFill style={{ opacity }}>
299
- <AbsoluteFill style={{ perspective: CAM.persp, perspectiveOrigin: CAM.origin }}>
300
- <div style={{
301
- position: 'absolute', left: CAM.left, top: CAM.top,
302
- transform: `rotateY(${CAM.rotY}deg) rotateZ(${CAM.rotZ}deg)`, transformOrigin: 'left top',
303
- }}>
304
- {/* 页面自身在其 3D 平面内横移(局部 X 轴) */}
305
- <div style={{ transform: `scale(${CAM.scale}) translateX(${lx}px)`, transformOrigin: 'left top' }}>
306
- <Panel shade={shade} t={t} />
307
- </div>
308
- </div>
309
- </AbsoluteFill>
310
- </AbsoluteFill>
311
- );
312
-
313
- export const STEEP_TILT_GLIDE_DURATION = 120; // 4s 单镜(滑移曲线按 0–120f 标定)
314
-
315
- export const SteepTiltGlide: React.FC = () => {
316
- const frame = useCurrentFrame();
317
-
318
- // 页面滑移(物动镜不动):局部 X 从 +140 → -2680,起步柔和后近匀速,
319
- // 全程不安定停死(bezier 尾段斜率不归零)
320
- const glide = Easing.bezier(0.3, 0.12, 0.72, 0.9);
321
- const lxAt = (f: number) => {
322
- const p = interpolate(f, [0, 120], [0, 1], { easing: glide, extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
323
- return interpolate(p, [0, 1], [60, -4100]);
324
- };
325
-
326
- const lx = lxAt(frame);
327
- // 面板黑罩:起始暗 → 约 1.4s 全亮(对齐原片节奏)
328
- const shade = interpolate(frame, [0, 18, 44], [0.7, 0.4, 0], { extrapolateRight: 'clamp' });
329
- // 重影强度 ∝ 滑移速度(拖尾=过去时刻的局部位置,同一固定镜头下重投影)
330
- const speed = Math.abs(lxAt(frame - 1) - lxAt(frame + 1)) / 2;
331
- // 三层更密的拖尾(权重递减),叠出连续拖影而非离散双影
332
- const g1 = Math.min(0.3, speed * 0.021);
333
- const g2 = Math.min(0.2, speed * 0.014);
334
- const g3 = Math.min(0.11, speed * 0.008);
335
- // 文字悬空贴落进程(v4 保留)
336
- const drop = interpolate(frame, [4, 100], [0, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
337
- // 紫晕随亮度浮现
338
- const glow = interpolate(frame, [14, 70], [0.15, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
339
-
340
- return (
341
- <AbsoluteFill style={{ background: '#060409' }}>
342
- {/* 左侧紫晕 */}
343
- <AbsoluteFill style={{
344
- opacity: glow,
345
- background: 'radial-gradient(ellipse 40% 50% at 20% 66%, rgba(118,58,190,0.30), transparent 70%)',
346
- }} />
347
- {/* 重影(先画,垫在本体后面;位置=过去时刻的页面局部位移) */}
348
- {g3 > 0.02 && <PanelLayer lx={lxAt(frame - 4.8)} shade={shade} opacity={g3} t={drop} />}
349
- {g2 > 0.02 && <PanelLayer lx={lxAt(frame - 3.2)} shade={shade} opacity={g2} t={drop} />}
350
- {g1 > 0.02 && <PanelLayer lx={lxAt(frame - 1.6)} shade={shade} opacity={g1} t={drop} />}
351
- {/* 本体 */}
352
- <PanelLayer lx={lx} shade={shade} opacity={1} t={drop} />
353
- {/* 景深雾(屏幕空间):斜墙远端(画面左侧)沉进暗场,近端保持亮 */}
354
- <AbsoluteFill style={{
355
- background: 'linear-gradient(100deg, rgba(6,4,10,0.62) 0%, rgba(6,4,10,0.28) 18%, rgba(6,4,10,0) 40%)',
356
- pointerEvents: 'none',
357
- }} />
358
- {/* 暗角 */}
359
- <AbsoluteFill style={{
360
- background: 'radial-gradient(ellipse 105% 95% at 55% 42%, transparent 60%, rgba(3,2,8,0.25) 85%, rgba(2,1,6,0.5) 100%)',
361
- pointerEvents: 'none',
362
- }} />
363
- <Grain opacity={0.07} blend="soft-light" />
364
- </AbsoluteFill>
365
- );
366
- };
1
+ // steep-tilt-glide v5(批次 14 #2)。用户意见(逐字):
2
+ // "角度不对,你看看原片这个镜头的角度;以及镜头是固定的,但是页面本身
3
+ // 往其3d空间的横面方向移动的效果"
4
+ // ——两点落实:①角度对照原片密帧校准(右缘近、左缘远的陡峭 rotateY,
5
+ // 顶缘向右上扬、透视灭点在左中下);②运动模型改"物动镜不动":
6
+ // perspective / perspectiveOrigin / rotateY / rotateZ 全程一个常数不动,
7
+ // 动的只有页面自身沿其 3D 平面横向(局部 X 轴)的滑移 translateX。
8
+ // v4 的悬空贴落(FloatWrap 同形软影)保留。
9
+ //
10
+ // 质感改版(镜头常数 / 滑移曲线 / 贴落节拍全部不动):字体换系统栈 + 按字号的字距;
11
+ // 同形软影加大虚化、压低不透明度——读作影子而不是一份重叠的字;速度重影从两层
12
+ // 离散拷贝改为三层更密的拖尾(f-1.6/-3.2/-4.8,权重递减),读作拖影而不是双影;
13
+ // 主区空白圆角砖填入克制的小组件内容;右段白页加发丝边与投影分层;屏幕空间
14
+ // 左侧景深雾 + 颗粒,远端更沉、近端更亮,强化 60° 斜墙的纵深。
15
+ import React from 'react';
16
+ import { AbsoluteFill, interpolate, useCurrentFrame, Easing } from 'remotion';
17
+ import { FONT as PFONT, Grain } from '../../_fixtures/Polish';
18
+ import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
19
+
20
+ const FONT = PFONT.sans;
21
+ const INK = '#2a2a31';
22
+
23
+ const easeFall = Easing.bezier(0.5, 0.05, 0.6, 1); // 加速贴落、末端软着陆
24
+
25
+ /* 悬浮 + 同形软影(GrazeFaceTour FloatWrap 模式) */
26
+ const FloatWrap: React.FC<{ h: number; children: React.ReactNode }> = ({ h, children }) => (
27
+ <div style={{ position: 'relative' }}>
28
+ {h > 2 && (
29
+ <div style={{
30
+ position: 'absolute', inset: 0,
31
+ transform: `translate(${h * 0.24}px, ${h * 0.46}px) scale(${1 + h * 0.0012})`,
32
+ // 影子要读作"影":随高度更虚、更淡,压成无字形的冷灰团(不再是一份可读的重叠字)
33
+ filter: `blur(${9 + h * 0.13}px) brightness(0.2) saturate(0)`,
34
+ opacity: Math.min(0.26, 0.1 + h * 0.0011),
35
+ pointerEvents: 'none',
36
+ }}>{children}</div>
37
+ )}
38
+ <div style={{ transform: `translate(${-h * 0.34}px, ${-h * 0.8}px)` }}>{children}</div>
39
+ </div>
40
+ );
41
+
42
+ /* land=贴合完成时刻(0..1),之前从 H 高度加速贴落 */
43
+ const liftOf = (t: number, land: number, H = 230) => {
44
+ const FALL = 0.32;
45
+ const p = Math.min(1, Math.max(0, (t - (land - FALL)) / FALL));
46
+ return (1 - easeFall(p)) * H;
47
+ };
48
+
49
+ /* 主区圆角灰砖里的图标:场记板(镜头 / 分镜的通用符号,取代原片的第三方 logo) */
50
+ const ClapperGlyph: React.FC<{ size: number }> = ({ size }) => (
51
+ <svg width={size} height={size} viewBox="0 0 100 100">
52
+ {/* 拍板:墨色条 + 琥珀斜纹 */}
53
+ <g transform="rotate(-12 10 34)">
54
+ <rect x={10} y={20} width={80} height={16} rx={3} fill={BRAND.ink} />
55
+ {[0, 1, 2, 3].map((i) => (
56
+ <path key={i} d={`M ${18 + i * 19} 36 L ${28 + i * 19} 20 L ${36 + i * 19} 20 L ${26 + i * 19} 36 Z`} fill={BRAND.amber} />
57
+ ))}
58
+ </g>
59
+ {/* 板身 */}
60
+ <rect x={10} y={40} width={80} height={46} rx={6} fill={BRAND.ink} />
61
+ <rect x={20} y={54} width={34} height={6} rx={3} fill={BRAND.paper} opacity={0.85} />
62
+ <rect x={20} y={68} width={52} height={6} rx={3} fill={BRAND.paper} opacity={0.5} />
63
+ </svg>
64
+ );
65
+
66
+ /* 主区小组件:三张白砖各一种(进度 / 待办 / 走势),内容坐标同页面(6200 宽体系) */
67
+ const MiniWidget: React.FC<{ kind: number }> = ({ kind }) => {
68
+ const title = ['Render queue', 'Shot list', 'Renders'][kind];
69
+ return (
70
+ <div style={{ fontFamily: FONT, color: INK }}>
71
+ <div style={{ display: 'flex', alignItems: 'center', gap: 22 }}>
72
+ <div style={{ width: 22, height: 22, borderRadius: 7, background: ['#7b68ee', '#e33bc6', '#49b8f9'][kind] }} />
73
+ <div style={{ fontSize: 46, fontWeight: 600, letterSpacing: '-0.015em' }}>{title}</div>
74
+ </div>
75
+ {kind === 0 && (
76
+ <>
77
+ <div style={{ marginTop: 40, fontSize: 120, fontWeight: 700, letterSpacing: '-0.04em', lineHeight: 1, fontVariantNumeric: 'tabular-nums' }}>72%</div>
78
+ <div style={{ marginTop: 34, height: 22, borderRadius: 11, background: '#ececf2' }}>
79
+ <div style={{ width: '72%', height: '100%', borderRadius: 11, background: 'linear-gradient(90deg, #7b68ee, #9b8cff)' }} />
80
+ </div>
81
+ </>
82
+ )}
83
+ {kind === 1 && (
84
+ <div style={{ marginTop: 36, display: 'flex', flexDirection: 'column', gap: 30 }}>
85
+ {[['Storyboard', 'Mon'], ['Sound design', 'Wed'], ['Final render', 'Fri']].map(([n, d], j) => (
86
+ <div key={n} style={{ display: 'flex', alignItems: 'center', gap: 24, fontSize: 40 }}>
87
+ <div style={{ width: 30, height: 30, borderRadius: 9, border: '4px solid #c9c9d4', boxSizing: 'border-box', background: j === 0 ? '#e33bc6' : 'transparent', borderColor: j === 0 ? '#e33bc6' : '#c9c9d4' }} />
88
+ <span style={{ color: j === 0 ? '#9a9aa6' : INK, textDecoration: j === 0 ? 'line-through' : 'none' }}>{n}</span>
89
+ <span style={{ marginLeft: 'auto', color: '#9a9aa6', fontSize: 34 }}>{d}</span>
90
+ </div>
91
+ ))}
92
+ </div>
93
+ )}
94
+ {kind === 2 && (
95
+ <svg width={440} height={150} viewBox="0 0 440 150" style={{ marginTop: 34, display: 'block' }}>
96
+ <path d="M0 120 C 50 110, 70 70, 120 78 S 200 120, 250 72 S 340 30, 440 18" fill="none" stroke="#49b8f9" strokeWidth={8} strokeLinecap="round" />
97
+ <path d="M0 120 C 50 110, 70 70, 120 78 S 200 120, 250 72 S 340 30, 440 18 V 150 H 0 Z" fill="rgba(73,184,249,0.12)" />
98
+ </svg>
99
+ )}
100
+ </div>
101
+ );
102
+ };
103
+
104
+ /* 页面:宽 6200 —— 左段=video-shotcraft 顶栏+侧栏(版式对齐原片用户截图三张),
105
+ 右段=原片后程滑入的图标砖、大 W 字、Launch film shots 列表 */
106
+ const PW = 6200;
107
+ const PH = 2400;
108
+
109
+ const Panel: React.FC<{ shade: number; t?: number }> = ({ shade, t = 1 }) => (
110
+ <div style={{
111
+ width: PW, height: PH, background: '#f4f4f6', borderRadius: 64,
112
+ position: 'relative', overflow: 'hidden',
113
+ boxShadow: '0 0 220px rgba(220,210,255,0.35)',
114
+ fontFamily: FONT,
115
+ }}>
116
+ {/* 顶部 tab 条(贯穿整页;文字悬空贴落) */}
117
+ <div style={{
118
+ position: 'absolute', top: 0, left: 0, width: PW, height: 230,
119
+ borderBottom: '4px solid #dcdce2', display: 'flex', alignItems: 'center', paddingLeft: 130,
120
+ }}>
121
+ <FloatWrap h={liftOf(t, 0.3)}>
122
+ <div style={{ display: 'flex', alignItems: 'center' }}>
123
+ <svg width={58} height={58} viewBox="0 0 40 40" style={{ marginRight: 34 }}>
124
+ {[[4, 4], [23, 4], [4, 23], [23, 23]].map(([x, y], i) => (
125
+ <rect key={i} x={x} y={y} width={13} height={13} rx={3} fill="none" stroke="#4a4a52" strokeWidth={3.5} />
126
+ ))}
127
+ </svg>
128
+ <div style={{ fontSize: 66, color: INK, fontWeight: 500, letterSpacing: '-0.01em' }}>Shot recipes</div>
129
+ </div>
130
+ </FloatWrap>
131
+ <FloatWrap h={liftOf(t, 0.42, 280)}>
132
+ <div style={{ display: 'flex', alignItems: 'center' }}>
133
+ {/* 标题前的品牌方块 → video-shotcraft 标志;标题字标全小写 */}
134
+ <ShotcraftMark size={150} tone="light" style={{ marginLeft: 110, flexShrink: 0 }} />
135
+ <div style={{ fontSize: 165, color: '#222228', fontWeight: 600, marginLeft: 70, letterSpacing: '-0.035em', whiteSpace: 'nowrap', fontFamily: BRAND.font }}>{BRAND.name}</div>
136
+ </div>
137
+ </FloatWrap>
138
+ {/* 顶栏右延的淡 tab(版式对齐原片 clickup04 顶栏) */}
139
+ {[['Launch storyboard', 3050], ['Camera moves', 3900], ['Renders', 4650]].map(([tb, x]) => (
140
+ <div key={tb as string} style={{ position: 'absolute', left: x as number, top: 88, fontSize: 58, color: '#8d8d96' }}>{tb}</div>
141
+ ))}
142
+ </div>
143
+ {/* 工作区 logo 行:video-shotcraft 标志 + 简称 */}
144
+ <div style={{ position: 'absolute', left: 120, top: 560 }}>
145
+ <FloatWrap h={liftOf(t, 0.54, 250)}>
146
+ <div style={{ display: 'flex', alignItems: 'center', gap: 26 }}>
147
+ <ShotcraftMark size={104} tone="light" />
148
+ <div style={{ fontSize: 92, fontWeight: 750, color: '#222228', letterSpacing: '-0.03em', fontFamily: BRAND.font }}>{BRAND.short}</div>
149
+ </div>
150
+ </FloatWrap>
151
+ </div>
152
+ {/* 主区圆角灰砖:场记板图标 + 下拉 chevron(原片 f45–f60) */}
153
+ <div style={{ position: 'absolute', left: 1330, top: 440 }}>
154
+ <FloatWrap h={liftOf(t, 0.62, 260)}>
155
+ <div style={{
156
+ width: 620, height: 350, background: '#ebebef', borderRadius: 56,
157
+ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 60,
158
+ }}>
159
+ <div style={{
160
+ width: 210, height: 210, background: '#fdfdfe', borderRadius: 44,
161
+ boxShadow: '0 6px 60px rgba(180,180,200,0.35)',
162
+ display: 'flex', alignItems: 'center', justifyContent: 'center',
163
+ }}>
164
+ <ClapperGlyph size={130} />
165
+ </div>
166
+ <svg width={90} height={90} viewBox="0 0 40 40">
167
+ <path d="M 10 15 L 20 26 L 30 15" fill="none" stroke="#6a6a74" strokeWidth={3.6} strokeLinecap="round" strokeLinejoin="round" />
168
+ </svg>
169
+ </div>
170
+ </FloatWrap>
171
+ </div>
172
+ {/* Home 宽药丸(紫边细线横贯面板) */}
173
+ <div style={{ position: 'absolute', left: 110, top: 830, width: 2900 }}>
174
+ <FloatWrap h={liftOf(t, 0.68, 260)}>
175
+ <div style={{
176
+ width: 2900, height: 168,
177
+ borderRadius: 34, border: '3.5px solid rgba(118,108,238,0.75)',
178
+ background: 'rgba(122,110,240,0.09)', display: 'flex', alignItems: 'center',
179
+ gap: 40, paddingLeft: 56, boxSizing: 'border-box',
180
+ }}>
181
+ <svg width={66} height={66} viewBox="0 0 40 40">
182
+ <path d="M 6 20 L 20 7 L 34 20 M 11 17 V 33 H 29 V 17" fill="none" stroke="#5a5ad2" strokeWidth={3.4} strokeLinecap="round" strokeLinejoin="round" />
183
+ </svg>
184
+ <div style={{ fontSize: 70, color: '#5353cf', fontWeight: 550 }}>Home</div>
185
+ </div>
186
+ </FloatWrap>
187
+ </div>
188
+ {/* Inbox 行 */}
189
+ <div style={{ position: 'absolute', left: 166, top: 1070 }}>
190
+ <FloatWrap h={liftOf(t, 0.8, 240)}>
191
+ <div style={{ display: 'flex', alignItems: 'center', gap: 40 }}>
192
+ <svg width={64} height={64} viewBox="0 0 40 40">
193
+ <path d="M 20 5 C 13 5 10 10 10 16 V 24 L 6 30 H 34 L 30 24 V 16 C 30 10 27 5 20 5 Z M 16 33 C 16 36 24 36 24 33"
194
+ fill="none" stroke="#3a3a42" strokeWidth={3} strokeLinecap="round" strokeLinejoin="round" />
195
+ </svg>
196
+ <div style={{ fontSize: 70, color: INK }}>Inbox</div>
197
+ </div>
198
+ </FloatWrap>
199
+ </div>
200
+ {/* 更多侧栏行 */}
201
+ {['Docs', 'Dashboards'].map((tb, i) => (
202
+ <div key={tb} style={{ position: 'absolute', left: 166, top: 1310 + i * 240 }}>
203
+ <FloatWrap h={liftOf(t, 0.86 + i * 0.06, 230)}>
204
+ <div style={{ display: 'flex', alignItems: 'center', gap: 40 }}>
205
+ <div style={{ width: 58, height: 58, border: '6px solid #8f8f98', borderRadius: 14 }} />
206
+ <div style={{ fontSize: 70, color: INK }}>{tb}</div>
207
+ </div>
208
+ </FloatWrap>
209
+ </div>
210
+ ))}
211
+ {/* 主区轮播左箭头(原片 f60 中景的 "<") */}
212
+ <div style={{ position: 'absolute', left: 2440, top: 1060 }}>
213
+ <svg width={120} height={120} viewBox="0 0 40 40">
214
+ <path d="M 26 6 L 12 20 L 26 34" fill="none" stroke="#2c2c33" strokeWidth={4.4} strokeLinecap="round" strokeLinejoin="round" />
215
+ </svg>
216
+ </div>
217
+ {/* 大 W 字形(原片中程右上滑入的大字残段) */}
218
+ <div style={{ position: 'absolute', left: 3050, top: 300, fontSize: 430, fontWeight: 700, color: '#232329', letterSpacing: '-0.04em' }}>W</div>
219
+ {/* 主区白色圆角卡群(右下白砖):填入克制的小组件内容,不再是空白块 */}
220
+ {[[2620, 620, 640, 380], [2740, 1360, 720, 420], [2620, 1900, 560, 330]].map(([x, y, w, h], i) => (
221
+ <div key={i} style={{
222
+ position: 'absolute', left: x, top: y, width: w, height: h, boxSizing: 'border-box',
223
+ background: 'linear-gradient(180deg, #ffffff 0%, #f9f9fb 100%)', borderRadius: 56,
224
+ border: '3px solid rgba(28,28,40,0.05)',
225
+ boxShadow: 'inset 0 4px 0 rgba(255,255,255,0.9), 0 8px 24px rgba(150,150,175,0.16), 0 40px 90px -30px rgba(120,120,150,0.32)',
226
+ padding: '52px 60px', overflow: 'hidden',
227
+ }}>
228
+ <MiniWidget kind={i} />
229
+ </div>
230
+ ))}
231
+ {/* —— 右段:Launch film shots 列表(原片尾程满幅白页) —— */}
232
+ <div style={{
233
+ position: 'absolute', left: 3560, top: 230, width: PW - 3560, height: PH - 230,
234
+ background: 'linear-gradient(180deg, #fdfdfe 0%, #f9f9fb 100%)',
235
+ // 发丝边 + 左侧投影:白页叠在主区之上,而不是一条生硬的色块分界
236
+ boxShadow: '-3px 0 0 rgba(28,28,40,0.06), -40px 0 90px -20px rgba(110,110,140,0.22)',
237
+ }}>
238
+ <div style={{ position: 'absolute', left: 220, top: 200, fontSize: 150, fontWeight: 700, color: '#1f1f25', letterSpacing: '-0.035em', whiteSpace: 'nowrap' }}>Launch film shots</div>
239
+ {/* List / Board tabs */}
240
+ <div style={{ position: 'absolute', left: 240, top: 480, display: 'flex', gap: 110, alignItems: 'center' }}>
241
+ <div style={{
242
+ display: 'flex', alignItems: 'center', gap: 26, background: '#ececf1',
243
+ borderRadius: 22, padding: '20px 40px',
244
+ }}>
245
+ <svg width={56} height={56} viewBox="0 0 40 40">
246
+ {[9, 20, 31].map((y) => (
247
+ <g key={y}>
248
+ <rect x={5} y={y - 1.6} width={4} height={4} fill="#3a3a42" />
249
+ <rect x={14} y={y - 1.4} width={20} height={3.4} rx={1.6} fill="#3a3a42" />
250
+ </g>
251
+ ))}
252
+ </svg>
253
+ <div style={{ fontSize: 62, fontWeight: 600, color: '#2c2c33' }}>List</div>
254
+ </div>
255
+ <div style={{ display: 'flex', alignItems: 'center', gap: 26 }}>
256
+ <svg width={56} height={56} viewBox="0 0 40 40">
257
+ <rect x={5} y={7} width={12} height={26} rx={3} fill="none" stroke="#3a3a42" strokeWidth={3} />
258
+ <rect x={23} y={7} width={12} height={18} rx={3} fill="none" stroke="#3a3a42" strokeWidth={3} />
259
+ </svg>
260
+ <div style={{ fontSize: 62, fontWeight: 500, color: '#2c2c33' }}>Board</div>
261
+ </div>
262
+ <div style={{ fontSize: 56, color: '#9a9aa4', marginLeft: -40 }}>11</div>
263
+ </div>
264
+ <div style={{ position: 'absolute', left: 900, top: 620, width: 1500, height: 3, background: '#e4e4ea' }} />
265
+ {/* IN PROGRESS chip */}
266
+ <div style={{
267
+ position: 'absolute', left: 240, top: 850, background: '#fce4f5', color: '#c93bb0',
268
+ fontSize: 46, fontWeight: 650, letterSpacing: '0.06em', padding: '14px 30px', borderRadius: 14,
269
+ }}>IN PROGRESS</div>
270
+ <div style={{ position: 'absolute', left: 244, top: 1030, fontSize: 44, fontWeight: 600, color: '#8f8f98', letterSpacing: '0.08em' }}>SHOT NAME</div>
271
+ {/* 任务行 */}
272
+ {[['Crash zoom opener', '#3a3a42'], ['Steep tilt glide', '#55555e'], ['Beat-synced cuts', '#83838d'], ['Logo sting', '#b3b3bc']].map(([name, col], i) => (
273
+ <div key={name as string} style={{ position: 'absolute', left: 280, top: 1180 + i * 210, display: 'flex', alignItems: 'center', gap: 56 }}>
274
+ <div style={{ width: 42, height: 42, borderRadius: 12, background: '#e33bc6' }} />
275
+ <div style={{ fontSize: 64, fontWeight: 550, color: col as string, whiteSpace: 'nowrap' }}>{name}</div>
276
+ </div>
277
+ ))}
278
+ </div>
279
+ {/* 亮度:面板内黑罩(随进度揭亮) */}
280
+ <div style={{ position: 'absolute', inset: 0, background: '#050409', opacity: shade }} />
281
+ {/* 左缘额外阴影(起始更暗,随亮度一同退去) */}
282
+ <div style={{
283
+ position: 'absolute', inset: 0,
284
+ background: 'linear-gradient(90deg, rgba(5,4,9,0.9), rgba(5,4,9,0) 42%)',
285
+ opacity: Math.min(1, shade * 1.6),
286
+ }} />
287
+ </div>
288
+ );
289
+
290
+ /* 固定镜头 + 页面沿自身平面横向滑移。
291
+ * 镜头常数(对照原片密帧校准):perspective 1150、origin 24% 62%、
292
+ * rotateY(-38°)(右缘近、左缘远,顶缘向右上扬)+ rotateZ(-2°)。
293
+ * lx = 页面局部 X 平移(页面自己的横面方向),全程唯一动的量 */
294
+ // v7(批次 16):用户意见"改成60度吧"——rotY -53 → -60(精确定值)
295
+ const CAM = { persp: 1100, origin: '30% 58%', rotY: -60, rotZ: -2, left: '40%', top: '15%', scale: 0.62 };
296
+
297
+ const PanelLayer: React.FC<{ lx: number; shade: number; opacity: number; t: number }> = ({ lx, shade, opacity, t }) => (
298
+ <AbsoluteFill style={{ opacity }}>
299
+ <AbsoluteFill style={{ perspective: CAM.persp, perspectiveOrigin: CAM.origin }}>
300
+ <div style={{
301
+ position: 'absolute', left: CAM.left, top: CAM.top,
302
+ transform: `rotateY(${CAM.rotY}deg) rotateZ(${CAM.rotZ}deg)`, transformOrigin: 'left top',
303
+ }}>
304
+ {/* 页面自身在其 3D 平面内横移(局部 X 轴) */}
305
+ <div style={{ transform: `scale(${CAM.scale}) translateX(${lx}px)`, transformOrigin: 'left top' }}>
306
+ <Panel shade={shade} t={t} />
307
+ </div>
308
+ </div>
309
+ </AbsoluteFill>
310
+ </AbsoluteFill>
311
+ );
312
+
313
+ export const STEEP_TILT_GLIDE_DURATION = 120; // 4s 单镜(滑移曲线按 0–120f 标定)
314
+
315
+ export const SteepTiltGlide: React.FC = () => {
316
+ const frame = useCurrentFrame();
317
+
318
+ // 页面滑移(物动镜不动):局部 X 从 +140 → -2680,起步柔和后近匀速,
319
+ // 全程不安定停死(bezier 尾段斜率不归零)
320
+ const glide = Easing.bezier(0.3, 0.12, 0.72, 0.9);
321
+ const lxAt = (f: number) => {
322
+ const p = interpolate(f, [0, 120], [0, 1], { easing: glide, extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
323
+ return interpolate(p, [0, 1], [60, -4100]);
324
+ };
325
+
326
+ const lx = lxAt(frame);
327
+ // 面板黑罩:起始暗 → 约 1.4s 全亮(对齐原片节奏)
328
+ const shade = interpolate(frame, [0, 18, 44], [0.7, 0.4, 0], { extrapolateRight: 'clamp' });
329
+ // 重影强度 ∝ 滑移速度(拖尾=过去时刻的局部位置,同一固定镜头下重投影)
330
+ const speed = Math.abs(lxAt(frame - 1) - lxAt(frame + 1)) / 2;
331
+ // 三层更密的拖尾(权重递减),叠出连续拖影而非离散双影
332
+ const g1 = Math.min(0.3, speed * 0.021);
333
+ const g2 = Math.min(0.2, speed * 0.014);
334
+ const g3 = Math.min(0.11, speed * 0.008);
335
+ // 文字悬空贴落进程(v4 保留)
336
+ const drop = interpolate(frame, [4, 100], [0, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
337
+ // 紫晕随亮度浮现
338
+ const glow = interpolate(frame, [14, 70], [0.15, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
339
+
340
+ return (
341
+ <AbsoluteFill style={{ background: '#060409' }}>
342
+ {/* 左侧紫晕 */}
343
+ <AbsoluteFill style={{
344
+ opacity: glow,
345
+ background: 'radial-gradient(ellipse 40% 50% at 20% 66%, rgba(118,58,190,0.30), transparent 70%)',
346
+ }} />
347
+ {/* 重影(先画,垫在本体后面;位置=过去时刻的页面局部位移) */}
348
+ {g3 > 0.02 && <PanelLayer lx={lxAt(frame - 4.8)} shade={shade} opacity={g3} t={drop} />}
349
+ {g2 > 0.02 && <PanelLayer lx={lxAt(frame - 3.2)} shade={shade} opacity={g2} t={drop} />}
350
+ {g1 > 0.02 && <PanelLayer lx={lxAt(frame - 1.6)} shade={shade} opacity={g1} t={drop} />}
351
+ {/* 本体 */}
352
+ <PanelLayer lx={lx} shade={shade} opacity={1} t={drop} />
353
+ {/* 景深雾(屏幕空间):斜墙远端(画面左侧)沉进暗场,近端保持亮 */}
354
+ <AbsoluteFill style={{
355
+ background: 'linear-gradient(100deg, rgba(6,4,10,0.62) 0%, rgba(6,4,10,0.28) 18%, rgba(6,4,10,0) 40%)',
356
+ pointerEvents: 'none',
357
+ }} />
358
+ {/* 暗角 */}
359
+ <AbsoluteFill style={{
360
+ background: 'radial-gradient(ellipse 105% 95% at 55% 42%, transparent 60%, rgba(3,2,8,0.25) 85%, rgba(2,1,6,0.5) 100%)',
361
+ pointerEvents: 'none',
362
+ }} />
363
+ <Grain opacity={0.07} blend="soft-light" />
364
+ </AbsoluteFill>
365
+ );
366
+ };