dsh-drawai 0.3.4 → 0.4.0

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 (533) hide show
  1. package/LICENSE +4142 -0
  2. package/README.md +43 -10
  3. package/lib/audio-media.js +147 -0
  4. package/lib/audio-service.js +66 -0
  5. package/lib/canvas-format.js +134 -0
  6. package/lib/client.js +5075 -181
  7. package/lib/comfyui-default-workflow.mjs +1825 -0
  8. package/lib/comfyui-workflow.mjs +426 -0
  9. package/lib/document-commands.js +12 -0
  10. package/lib/document-core.js +29 -0
  11. package/lib/drawing-tasks.js +26 -0
  12. package/lib/imagegen.mjs +596 -0
  13. package/lib/index.js +1758 -129
  14. package/lib/media.js +26 -13
  15. package/lib/mgstyle-core.js +75 -0
  16. package/lib/motion/apply.js +180 -0
  17. package/lib/motion/asset-pack-lock.js +10 -0
  18. package/lib/motion/asset-pack.js +335 -0
  19. package/lib/motion/assets.js +290 -0
  20. package/lib/motion/audio.js +103 -0
  21. package/lib/motion/audiolevel.js +63 -0
  22. package/lib/motion/audiomix.js +144 -0
  23. package/lib/motion/beats.js +337 -0
  24. package/lib/motion/builtin-assets.js +62 -0
  25. package/lib/motion/canvas-spec.js +442 -0
  26. package/lib/motion/capture.js +95 -0
  27. package/lib/motion/cards.js +80 -0
  28. package/lib/motion/collect.js +447 -0
  29. package/lib/motion/delivery.js +112 -0
  30. package/lib/motion/edge-speech.py +90 -0
  31. package/lib/motion/entry.jsx +73 -0
  32. package/lib/motion/export.js +200 -0
  33. package/lib/motion/ffmpeg.js +42 -0
  34. package/lib/motion/fonts.js +71 -0
  35. package/lib/motion/jobs.js +113 -0
  36. package/lib/motion/json.js +4 -0
  37. package/lib/motion/media-catalog.js +59 -0
  38. package/lib/motion/mgstyles/BRIEF-TEMPLATE.md +63 -0
  39. package/lib/motion/mgstyles/briefs/01-flat-vector.md +104 -0
  40. package/lib/motion/mgstyles/briefs/02-line-art.md +97 -0
  41. package/lib/motion/mgstyles/briefs/03-isometric.md +108 -0
  42. package/lib/motion/mgstyles/briefs/05-cel-boil.md +145 -0
  43. package/lib/motion/mgstyles/briefs/06-collage.md +149 -0
  44. package/lib/motion/mgstyles/briefs/07-liquid.md +106 -0
  45. package/lib/motion/mgstyles/briefs/08-morph.md +111 -0
  46. package/lib/motion/mgstyles/briefs/09-bauhaus.md +150 -0
  47. package/lib/motion/mgstyles/briefs/10-synthwave.md +151 -0
  48. package/lib/motion/mgstyles/briefs/12-aurora-glass.md +147 -0
  49. package/lib/motion/mgstyles/briefs/18-hanazi.md +140 -0
  50. package/lib/motion/mgstyles/briefs/19-paperclip.md +156 -0
  51. package/lib/motion/mgstyles/briefs/20-pixel.md +118 -0
  52. package/lib/motion/mgstyles/briefs/22-hud.md +118 -0
  53. package/lib/motion/mgstyles/catalog.d/01-flat-vector.json +34 -0
  54. package/lib/motion/mgstyles/catalog.d/02-line-art.json +34 -0
  55. package/lib/motion/mgstyles/catalog.d/03-isometric.json +35 -0
  56. package/lib/motion/mgstyles/catalog.d/05-cel-boil.json +28 -0
  57. package/lib/motion/mgstyles/catalog.d/06-collage.json +28 -0
  58. package/lib/motion/mgstyles/catalog.d/07-liquid.json +28 -0
  59. package/lib/motion/mgstyles/catalog.d/08-morph.json +28 -0
  60. package/lib/motion/mgstyles/catalog.d/09-bauhaus.json +28 -0
  61. package/lib/motion/mgstyles/catalog.d/10-synthwave.json +28 -0
  62. package/lib/motion/mgstyles/catalog.d/12-aurora-glass.json +28 -0
  63. package/lib/motion/mgstyles/catalog.d/18-hanazi.json +28 -0
  64. package/lib/motion/mgstyles/catalog.d/19-paperclip.json +28 -0
  65. package/lib/motion/mgstyles/catalog.d/20-pixel.json +28 -0
  66. package/lib/motion/mgstyles/catalog.d/22-hud.json +28 -0
  67. package/lib/motion/mgstyles/catalog.json +1356 -0
  68. package/lib/motion/mgstyles/upstream/README.md +147 -0
  69. package/lib/motion/mgstyles/upstream/README.zh-CN.md +147 -0
  70. package/lib/motion/mgstyles/upstream/demos/01-flat-vector/cues.json +1 -0
  71. package/lib/motion/mgstyles/upstream/demos/01-flat-vector/index.html +712 -0
  72. package/lib/motion/mgstyles/upstream/demos/02-line-art/cues.json +331 -0
  73. package/lib/motion/mgstyles/upstream/demos/02-line-art/film.js +676 -0
  74. package/lib/motion/mgstyles/upstream/demos/02-line-art/index.html +18 -0
  75. package/lib/motion/mgstyles/upstream/demos/02-line-art/tools/dump_timing.mjs +26 -0
  76. package/lib/motion/mgstyles/upstream/demos/03-isometric/cues.json +109 -0
  77. package/lib/motion/mgstyles/upstream/demos/03-isometric/index.html +25 -0
  78. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/anim.js +82 -0
  79. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/main.js +219 -0
  80. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/night5.js +180 -0
  81. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/render.js +202 -0
  82. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/title.js +167 -0
  83. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/title5.js +294 -0
  84. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/ui.js +141 -0
  85. package/lib/motion/mgstyles/upstream/demos/03-isometric/js/world.js +1399 -0
  86. package/lib/motion/mgstyles/upstream/demos/05-cel-boil/cues.json +157 -0
  87. package/lib/motion/mgstyles/upstream/demos/05-cel-boil/index.html +34 -0
  88. package/lib/motion/mgstyles/upstream/demos/05-cel-boil/js/engine.js +326 -0
  89. package/lib/motion/mgstyles/upstream/demos/05-cel-boil/js/scene.js +2036 -0
  90. package/lib/motion/mgstyles/upstream/demos/06-collage/assets/gen/layout.json +157 -0
  91. package/lib/motion/mgstyles/upstream/demos/06-collage/cues.json +80 -0
  92. package/lib/motion/mgstyles/upstream/demos/06-collage/index.html +889 -0
  93. package/lib/motion/mgstyles/upstream/demos/07-liquid/cues.json +100 -0
  94. package/lib/motion/mgstyles/upstream/demos/07-liquid/index.html +108 -0
  95. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/engine.js +153 -0
  96. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/links.js +64 -0
  97. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/lookdev.js +46 -0
  98. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/scene.js +963 -0
  99. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/shaders.js +647 -0
  100. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/textsdf.js +114 -0
  101. package/lib/motion/mgstyles/upstream/demos/07-liquid/js/type.js +50 -0
  102. package/lib/motion/mgstyles/upstream/demos/08-morph/cues.json +131 -0
  103. package/lib/motion/mgstyles/upstream/demos/08-morph/glyphs.json +1 -0
  104. package/lib/motion/mgstyles/upstream/demos/08-morph/index.html +901 -0
  105. package/lib/motion/mgstyles/upstream/demos/09-bauhaus/cues.json +270 -0
  106. package/lib/motion/mgstyles/upstream/demos/09-bauhaus/film.js +697 -0
  107. package/lib/motion/mgstyles/upstream/demos/09-bauhaus/index.html +12 -0
  108. package/lib/motion/mgstyles/upstream/demos/10-synthwave/cues.json +44 -0
  109. package/lib/motion/mgstyles/upstream/demos/10-synthwave/index.html +1028 -0
  110. package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/cues.json +67 -0
  111. package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/index.html +16 -0
  112. package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/main.js +967 -0
  113. package/lib/motion/mgstyles/upstream/demos/12-aurora-glass/shaders.js +468 -0
  114. package/lib/motion/mgstyles/upstream/demos/18-hanazi/cues.json +117 -0
  115. package/lib/motion/mgstyles/upstream/demos/18-hanazi/index.html +541 -0
  116. package/lib/motion/mgstyles/upstream/demos/19-paperclip/assets/countries-110m.json +1 -0
  117. package/lib/motion/mgstyles/upstream/demos/19-paperclip/assets/stickers/meta.json +34 -0
  118. package/lib/motion/mgstyles/upstream/demos/19-paperclip/cues.json +285 -0
  119. package/lib/motion/mgstyles/upstream/demos/19-paperclip/index.html +599 -0
  120. package/lib/motion/mgstyles/upstream/demos/20-pixel/cues.json +42 -0
  121. package/lib/motion/mgstyles/upstream/demos/20-pixel/film.js +914 -0
  122. package/lib/motion/mgstyles/upstream/demos/20-pixel/index.html +18 -0
  123. package/lib/motion/mgstyles/upstream/demos/22-hud/cues.json +108 -0
  124. package/lib/motion/mgstyles/upstream/demos/22-hud/index.html +125 -0
  125. package/lib/motion/mgstyles/upstream/demos/22-hud/js/holo.js +275 -0
  126. package/lib/motion/mgstyles/upstream/demos/22-hud/js/hud.js +855 -0
  127. package/lib/motion/mgstyles/upstream/demos/22-hud/js/post.js +150 -0
  128. package/lib/motion/mgstyles/upstream/demos/22-hud/js/util.js +65 -0
  129. package/lib/motion/mgstyles/upstream/demos/22-hud/js/v5.js +142 -0
  130. package/lib/motion/mgstyles/upstream/harness/render.mjs +319 -0
  131. package/lib/motion/mgstyles/upstream/manifest.json +269 -0
  132. package/lib/motion/mgstyles/upstream/prompts/01-flat-vector.md +98 -0
  133. package/lib/motion/mgstyles/upstream/prompts/02-line-art.md +95 -0
  134. package/lib/motion/mgstyles/upstream/prompts/03-isometric.md +97 -0
  135. package/lib/motion/mgstyles/upstream/prompts/05-cel-boil.md +95 -0
  136. package/lib/motion/mgstyles/upstream/prompts/06-collage.md +95 -0
  137. package/lib/motion/mgstyles/upstream/prompts/07-liquid.md +98 -0
  138. package/lib/motion/mgstyles/upstream/prompts/08-morph.md +95 -0
  139. package/lib/motion/mgstyles/upstream/prompts/09-bauhaus.md +96 -0
  140. package/lib/motion/mgstyles/upstream/prompts/10-synthwave.md +95 -0
  141. package/lib/motion/mgstyles/upstream/prompts/12-aurora-glass.md +96 -0
  142. package/lib/motion/mgstyles/upstream/prompts/18-hanazi.md +95 -0
  143. package/lib/motion/mgstyles/upstream/prompts/19-paperclip.md +96 -0
  144. package/lib/motion/mgstyles/upstream/prompts/20-pixel.md +96 -0
  145. package/lib/motion/mgstyles/upstream/prompts/22-hud.md +95 -0
  146. package/lib/motion/mgstyles/upstream/rubric.md +51 -0
  147. package/lib/motion/mgstyles/upstream/template.md +36 -0
  148. package/lib/motion/pixelqa.js +198 -0
  149. package/lib/motion/preview.js +95 -0
  150. package/lib/motion/project.js +395 -0
  151. package/lib/motion/qa.js +290 -0
  152. package/lib/motion/reference-media.jsx +10 -0
  153. package/lib/motion/render-settings.js +112 -0
  154. package/lib/motion/render.js +159 -0
  155. package/lib/motion/scene-kit.js +183 -0
  156. package/lib/motion/sfx.js +232 -0
  157. package/lib/motion/shotcraft/ClipCard.tsx +204 -0
  158. package/lib/motion/shotcraft/catalog.json +2461 -0
  159. package/lib/motion/shotcraft/upstream/SKILL.md +286 -0
  160. package/lib/motion/shotcraft/upstream/assets/lib/Caption.tsx +54 -0
  161. package/lib/motion/shotcraft/upstream/assets/lib/ClipCard.tsx +200 -0
  162. package/lib/motion/shotcraft/upstream/assets/lib/DigitRoll.tsx +45 -0
  163. package/lib/motion/shotcraft/upstream/assets/lib/FlashCut.tsx +20 -0
  164. package/lib/motion/shotcraft/upstream/assets/lib/FlatPanel.tsx +65 -0
  165. package/lib/motion/shotcraft/upstream/assets/lib/PageCam.tsx +151 -0
  166. package/lib/motion/shotcraft/upstream/assets/lib/VerticalTicker.tsx +129 -0
  167. package/lib/motion/shotcraft/upstream/assets/lib/helpers/camera.tsx +75 -0
  168. package/lib/motion/shotcraft/upstream/assets/lib/helpers/motion.ts +40 -0
  169. package/lib/motion/shotcraft/upstream/assets/lib/helpers/rand.ts +11 -0
  170. package/lib/motion/shotcraft/upstream/assets/lib/helpers/shake.ts +10 -0
  171. package/lib/motion/shotcraft/upstream/assets/scripts/__pycache__/sfx-source.cpython-313.pyc +0 -0
  172. package/lib/motion/shotcraft/upstream/assets/scripts/build-readme-cover.mjs +49 -0
  173. package/lib/motion/shotcraft/upstream/assets/scripts/capture-template.mjs +210 -0
  174. package/lib/motion/shotcraft/upstream/assets/scripts/sfx-source.py +423 -0
  175. package/lib/motion/shotcraft/upstream/assets/scripts/smoke-render-demos.py +170 -0
  176. package/lib/motion/shotcraft/upstream/assets/scripts/test_sfx_source.py +157 -0
  177. package/lib/motion/shotcraft/upstream/demos/README.md +120 -0
  178. package/lib/motion/shotcraft/upstream/demos/_fixtures/Brand.tsx +112 -0
  179. package/lib/motion/shotcraft/upstream/demos/_fixtures/Fixtures.tsx +647 -0
  180. package/lib/motion/shotcraft/upstream/demos/_fixtures/Look.tsx +316 -0
  181. package/lib/motion/shotcraft/upstream/demos/_fixtures/Motion.tsx +82 -0
  182. package/lib/motion/shotcraft/upstream/demos/_fixtures/PageCam2D.tsx +115 -0
  183. package/lib/motion/shotcraft/upstream/demos/_fixtures/Polish.tsx +243 -0
  184. package/lib/motion/shotcraft/upstream/demos/_textures/live-layout.json +389 -0
  185. package/lib/motion/shotcraft/upstream/demos/camera/basic-3d-scene/Basic3DScene.tsx +250 -0
  186. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashImpactReal.tsx +305 -0
  187. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashZoomReal.tsx +246 -0
  188. package/lib/motion/shotcraft/upstream/demos/camera/cursor-flyover/CursorFlyover.tsx +390 -0
  189. package/lib/motion/shotcraft/upstream/demos/camera/depth-layer-moves/MultiplaneReal.tsx +138 -0
  190. package/lib/motion/shotcraft/upstream/demos/camera/graze-face-tour/GrazeFaceTour.tsx +542 -0
  191. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/OverheadTabletopDrop.tsx +315 -0
  192. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/TiltReveal.tsx +299 -0
  193. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/DroneDiveLanding.tsx +173 -0
  194. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/ExplodedView.tsx +348 -0
  195. package/lib/motion/shotcraft/upstream/demos/camera/steep-tilt-glide/SteepTiltGlide.tsx +366 -0
  196. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx +279 -0
  197. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/PullBackIsolation.tsx +184 -0
  198. package/lib/motion/shotcraft/upstream/demos/camera/terminal-3d/Terminal3D.tsx +390 -0
  199. package/lib/motion/shotcraft/upstream/demos/data/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +155 -0
  200. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/AxisRescaleShockV2.tsx +303 -0
  201. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/OscilloscopeStreamV2.tsx +290 -0
  202. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/UnitDotSwarmRegroupV2.tsx +278 -0
  203. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/NeedleSweepSelftest.tsx +307 -0
  204. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/TapeScrollFixedPointer.tsx +215 -0
  205. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/BrakeReticleLock.tsx +299 -0
  206. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/ChangelogScrollBrake.tsx +232 -0
  207. package/lib/motion/shotcraft/upstream/demos/data/timeline-travel/TimelineTravel.tsx +290 -0
  208. package/lib/motion/shotcraft/upstream/demos/effects/assemble-then-type-flyin/AssembleThenTypeFlyin.tsx +273 -0
  209. package/lib/motion/shotcraft/upstream/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx +167 -0
  210. package/lib/motion/shotcraft/upstream/demos/effects/brand-frame-snap/BrandFrameSnap.tsx +536 -0
  211. package/lib/motion/shotcraft/upstream/demos/effects/fui-hud-moves/ReticleLockOn.tsx +164 -0
  212. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/FlylineArc.tsx +175 -0
  213. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/GlowOrbAmbient.tsx +197 -0
  214. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/OrbFlylineRelay.tsx +241 -0
  215. package/lib/motion/shotcraft/upstream/demos/effects/icon-performance-moves/AttentionBounce.tsx +279 -0
  216. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/AnimeImpact.tsx +230 -0
  217. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/HitCounter.tsx +345 -0
  218. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SheenSweepRetry.tsx +275 -0
  219. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SpotlightSweepReveal.tsx +229 -0
  220. package/lib/motion/shotcraft/upstream/demos/effects/radial-ripple-phone-chips/RadialRipplePhoneChips.tsx +312 -0
  221. package/lib/motion/shotcraft/upstream/demos/effects/riso-print-hits/RisoMisregistrationHit.tsx +222 -0
  222. package/lib/motion/shotcraft/upstream/demos/effects/scan-bracket-sweep/ScanBracketSweep.tsx +295 -0
  223. package/lib/motion/shotcraft/upstream/demos/effects/scanline-annotate-focus/ScanlineAnnotateFocus.tsx +329 -0
  224. package/lib/motion/shotcraft/upstream/demos/effects/scanline-assemble-flyin/ScanlineAssembleFlyin.tsx +315 -0
  225. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ImpactBurstKit.tsx +264 -0
  226. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/KanadaPerspectiveSnap.tsx +260 -0
  227. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ScoreSlam.tsx +263 -0
  228. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/CornerSpotlightReveal.tsx +123 -0
  229. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +187 -0
  230. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/SlideSpotlightPan.tsx +175 -0
  231. package/lib/motion/shotcraft/upstream/demos/interaction/autolayout-gap-dial/AutolayoutGapDial.tsx +305 -0
  232. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/DiagramCascadeBuild.tsx +350 -0
  233. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +352 -0
  234. package/lib/motion/shotcraft/upstream/demos/interaction/chip-grid-single-select-blackout/ChipGridSingleSelectBlackout.tsx +218 -0
  235. package/lib/motion/shotcraft/upstream/demos/interaction/collab-cursor-moves/CursorCastEnsemble.tsx +297 -0
  236. package/lib/motion/shotcraft/upstream/demos/interaction/glass-pill-dictation-typing/GlassPillDictationTyping.tsx +157 -0
  237. package/lib/motion/shotcraft/upstream/demos/interaction/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +218 -0
  238. package/lib/motion/shotcraft/upstream/demos/interaction/picker-carousel-feature-cycle/PickerCarouselFeatureCycle.tsx +202 -0
  239. package/lib/motion/shotcraft/upstream/demos/interaction/segmented-thumb-hero/SegmentedThumbHero.tsx +265 -0
  240. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/PaletteThemeRipple.tsx +457 -0
  241. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/ThemeSweepToggle.tsx +446 -0
  242. package/lib/motion/shotcraft/upstream/demos/interaction/type-and-filter/TypeAndFilter.tsx +249 -0
  243. package/lib/motion/shotcraft/upstream/demos/interaction/voice-waveform-live/VoiceWaveformLive.tsx +278 -0
  244. package/lib/motion/shotcraft/upstream/demos/opening/crane-rise-reveal/CraneRiseReveal.tsx +332 -0
  245. package/lib/motion/shotcraft/upstream/demos/opening/dataviz-landscape-open/DatavizLandscapeOpen.tsx +358 -0
  246. package/lib/motion/shotcraft/upstream/demos/opening/fracture/Fracture.tsx +201 -0
  247. package/lib/motion/shotcraft/upstream/demos/opening/icon-field-colorize/IconFieldColorize.tsx +200 -0
  248. package/lib/motion/shotcraft/upstream/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx +208 -0
  249. package/lib/motion/shotcraft/upstream/demos/opening/magician-card-flourish/MagicianCardFlourish.tsx +341 -0
  250. package/lib/motion/shotcraft/upstream/demos/opening/orbit-ring-title-open/OrbitRingTitleOpen.tsx +389 -0
  251. package/lib/motion/shotcraft/upstream/demos/opening/spotlight-hero-card/SpotlightHeroCard.tsx +293 -0
  252. package/lib/motion/shotcraft/upstream/demos/opening/stroke-segment-build/StrokeSegmentBuild.tsx +183 -0
  253. package/lib/motion/shotcraft/upstream/demos/opening/text-as-mask/TextAsMask.tsx +245 -0
  254. package/lib/motion/shotcraft/upstream/demos/outro/grain-dissolve/GrainDissolve.tsx +222 -0
  255. package/lib/motion/shotcraft/upstream/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx +223 -0
  256. package/lib/motion/shotcraft/upstream/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx +217 -0
  257. package/lib/motion/shotcraft/upstream/demos/outro/outro-group-photo-launch/OutroGroupPhotoLaunch.tsx +343 -0
  258. package/lib/motion/shotcraft/upstream/demos/outro/ui-strip-away-outro/UiStripAwayOutro.tsx +357 -0
  259. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/IconFlipBloomLogo.tsx +187 -0
  260. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/InputMorphsIntoLogo.tsx +333 -0
  261. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-cut-moves/PaparazziFlash.tsx +274 -0
  262. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +270 -0
  263. package/lib/motion/shotcraft/upstream/demos/rhythm/panel-grid-moves/ComicPanelSplit.tsx +430 -0
  264. package/lib/motion/shotcraft/upstream/demos/rhythm/quad-split-parallel-scenes/QuadSplitParallelScenes.tsx +252 -0
  265. package/lib/motion/shotcraft/upstream/demos/rhythm/rhythm-interrupt-moves/JumpCutPunchIn.tsx +106 -0
  266. package/lib/motion/shotcraft/upstream/demos/rhythm/sakuga-timing-shift/SakugaTimingShift.tsx +288 -0
  267. package/lib/motion/shotcraft/upstream/demos/rhythm/speed-ramp-freeze/FreezeAnnotateReal.tsx +362 -0
  268. package/lib/motion/shotcraft/upstream/demos/rhythm/trailer-grammar-moves/TrailerBumper.tsx +168 -0
  269. package/lib/motion/shotcraft/upstream/demos/transition/bottom-push-stack-wipe/BottomPushStackWipe.tsx +310 -0
  270. package/lib/motion/shotcraft/upstream/demos/transition/card-flip-reveal/CardFlipReveal.tsx +261 -0
  271. package/lib/motion/shotcraft/upstream/demos/transition/card-flock-tumble/CardFlockTumble.tsx +459 -0
  272. package/lib/motion/shotcraft/upstream/demos/transition/circle-match-iris/CircleMatchIris.tsx +294 -0
  273. package/lib/motion/shotcraft/upstream/demos/transition/gradient-transition/GradientTransition.tsx +161 -0
  274. package/lib/motion/shotcraft/upstream/demos/transition/line-carry-transition/LineCarryTransition.tsx +248 -0
  275. package/lib/motion/shotcraft/upstream/demos/transition/mosaic-reframe/MosaicReframe.tsx +359 -0
  276. package/lib/motion/shotcraft/upstream/demos/transition/page-turn-transitions/BarnDoorSplit.tsx +227 -0
  277. package/lib/motion/shotcraft/upstream/demos/transition/print-texture-transitions/InkBleedReveal.tsx +162 -0
  278. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/PortalWipeV2.tsx +248 -0
  279. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/WhipBrakeReal.tsx +186 -0
  280. package/lib/motion/shotcraft/upstream/demos/transition/tear-streak-transitions/GlitchDisplace.tsx +355 -0
  281. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/InvisibleCut.tsx +272 -0
  282. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/LightLeakBurn.tsx +262 -0
  283. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/VersusSlam.tsx +217 -0
  284. package/lib/motion/shotcraft/upstream/demos/transition/transition-travel/LetterformZoom.tsx +285 -0
  285. package/lib/motion/shotcraft/upstream/demos/transition/white-flash-logo-simplify-cut/WhiteFlashLogoSimplifyCut.tsx +205 -0
  286. package/lib/motion/shotcraft/upstream/demos/transition/wipe-transitions/BlindsSlice.tsx +178 -0
  287. package/lib/motion/shotcraft/upstream/demos/typography/blur-slide/BlurSlide.tsx +147 -0
  288. package/lib/motion/shotcraft/upstream/demos/typography/brace-expand/BraceExpand.tsx +143 -0
  289. package/lib/motion/shotcraft/upstream/demos/typography/brand-ink-open/BrandInkOpen.tsx +134 -0
  290. package/lib/motion/shotcraft/upstream/demos/typography/countdown-arc-scatter/CountdownArcScatter.tsx +217 -0
  291. package/lib/motion/shotcraft/upstream/demos/typography/flying-words/FlyingWords.tsx +198 -0
  292. package/lib/motion/shotcraft/upstream/demos/typography/glitch-cycle/GlitchCycle.tsx +221 -0
  293. package/lib/motion/shotcraft/upstream/demos/typography/gradient-word-sweep/GradientWordSweep.tsx +312 -0
  294. package/lib/motion/shotcraft/upstream/demos/typography/lead-word-zoom-assemble/LeadWordZoomAssemble.tsx +261 -0
  295. package/lib/motion/shotcraft/upstream/demos/typography/marker-underline-title/MarkerUnderlineTitle.tsx +121 -0
  296. package/lib/motion/shotcraft/upstream/demos/typography/outline-word-fill/OutlineWordFill.tsx +153 -0
  297. package/lib/motion/shotcraft/upstream/demos/typography/paper-title-card/PaperTitleCard.tsx +179 -0
  298. package/lib/motion/shotcraft/upstream/demos/typography/pill-chip-slot-cycle-handled/PillChipSlotCycleHandled.tsx +140 -0
  299. package/lib/motion/shotcraft/upstream/demos/typography/pill-slot-cycle/PillSlotCycle.tsx +309 -0
  300. package/lib/motion/shotcraft/upstream/demos/typography/text-column-converge/TextColumnConverge.tsx +191 -0
  301. package/lib/motion/shotcraft/upstream/demos/typography/title-demote-to-label/TitleDemoteToLabel.tsx +292 -0
  302. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/LetterformDriftAssembly.tsx +135 -0
  303. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/SplitTextStagger.tsx +124 -0
  304. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/TextOnPath.tsx +255 -0
  305. package/lib/motion/shotcraft/upstream/demos/typography/type-entrance-moves/LetterDropPhysics.tsx +173 -0
  306. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/FontWeightPump.tsx +225 -0
  307. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/KaraokeFillSync.tsx +141 -0
  308. package/lib/motion/shotcraft/upstream/demos/typography/typewriter-moves/TypewriterErrorRetype.tsx +137 -0
  309. package/lib/motion/shotcraft/upstream/demos/typography/vertical-word-roll-blur-cycle/VerticalWordRollBlurCycle.tsx +147 -0
  310. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-filmstrip/WordRelayFilmstrip.tsx +409 -0
  311. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-geometry/WordRelayGeometry.tsx +280 -0
  312. package/lib/motion/shotcraft/upstream/demos/ui-entrance/avatar-bracket-carousel/AvatarBracketCarousel.tsx +271 -0
  313. package/lib/motion/shotcraft/upstream/demos/ui-entrance/bezier-source-converge-merge/BezierSourceConvergeMerge.tsx +385 -0
  314. package/lib/motion/shotcraft/upstream/demos/ui-entrance/card-stack/CardStack.tsx +312 -0
  315. package/lib/motion/shotcraft/upstream/demos/ui-entrance/carousel-3d/Carousel3D.tsx +303 -0
  316. package/lib/motion/shotcraft/upstream/demos/ui-entrance/clipcard-looping/ClipCardLooping.tsx +77 -0
  317. package/lib/motion/shotcraft/upstream/demos/ui-entrance/cloner-depth-echo/ClonerDepthEcho.tsx +311 -0
  318. package/lib/motion/shotcraft/upstream/demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx +307 -0
  319. package/lib/motion/shotcraft/upstream/demos/ui-entrance/doc-park-left-pill-deal/DocParkLeftPillDeal.tsx +349 -0
  320. package/lib/motion/shotcraft/upstream/demos/ui-entrance/document-typewriter-reveal/DocumentTypewriterReveal.tsx +255 -0
  321. package/lib/motion/shotcraft/upstream/demos/ui-entrance/draw-svg-trace/DrawSvgTrace.tsx +244 -0
  322. package/lib/motion/shotcraft/upstream/demos/ui-entrance/element-body-moves/ContactShadowLift.tsx +217 -0
  323. package/lib/motion/shotcraft/upstream/demos/ui-entrance/integration-hub-map/IntegrationHubMap.tsx +652 -0
  324. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-reveal/ListReveal.tsx +153 -0
  325. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-stack-press/ListStackPress.tsx +238 -0
  326. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-forerun/NeonFrameForerun.tsx +324 -0
  327. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +354 -0
  328. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/PageWaterfallWall.tsx +101 -0
  329. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/VerticalTicker.tsx +129 -0
  330. package/lib/motion/shotcraft/upstream/demos/ui-entrance/product-card-progressive-assemble/ProductCardProgressiveAssemble.tsx +297 -0
  331. package/lib/motion/shotcraft/upstream/demos/ui-entrance/radial-wave/RadialWave.tsx +57 -0
  332. package/lib/motion/shotcraft/upstream/demos/ui-entrance/research-card-stack-scroll/ResearchCardStackScroll.tsx +155 -0
  333. package/lib/motion/shotcraft/upstream/demos/ui-entrance/row-embed/RowEmbed.tsx +175 -0
  334. package/lib/motion/shotcraft/upstream/demos/ui-entrance/value-stagger-gradient/ValueStaggerGradient.tsx +153 -0
  335. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/BentoLightUp.tsx +146 -0
  336. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/WireframeDrawOn.tsx +226 -0
  337. package/lib/motion/shotcraft/upstream/gallery/api/library.json +1 -0
  338. package/lib/motion/shotcraft/upstream/manifest.json +2715 -0
  339. package/lib/motion/shotcraft/upstream/references/aesthetic-rules.md +193 -0
  340. package/lib/motion/shotcraft/upstream/references/final-review.md +121 -0
  341. package/lib/motion/shotcraft/upstream/references/guided-free-creation.md +199 -0
  342. package/lib/motion/shotcraft/upstream/references/jianying-export.md +183 -0
  343. package/lib/motion/shotcraft/upstream/references/music-beat-sync.md +257 -0
  344. package/lib/motion/shotcraft/upstream/references/pipeline.md +382 -0
  345. package/lib/motion/shotcraft/upstream/references/publish-upload-post.md +111 -0
  346. package/lib/motion/shotcraft/upstream/references/sequences/promo-energy-arc.md +50 -0
  347. package/lib/motion/shotcraft/upstream/references/sfx-sourcing.md +95 -0
  348. package/lib/motion/shotcraft/upstream/references/shots/camera/basic-3d-scene.md +41 -0
  349. package/lib/motion/shotcraft/upstream/references/shots/camera/crash-zoom-punch.md +52 -0
  350. package/lib/motion/shotcraft/upstream/references/shots/camera/cursor-flyover.md +39 -0
  351. package/lib/motion/shotcraft/upstream/references/shots/camera/depth-layer-moves.md +39 -0
  352. package/lib/motion/shotcraft/upstream/references/shots/camera/graze-face-tour.md +57 -0
  353. package/lib/motion/shotcraft/upstream/references/shots/camera/overhead-camera-moves.md +51 -0
  354. package/lib/motion/shotcraft/upstream/references/shots/camera/space-camera-moves.md +46 -0
  355. package/lib/motion/shotcraft/upstream/references/shots/camera/steep-tilt-glide.md +52 -0
  356. package/lib/motion/shotcraft/upstream/references/shots/camera/tension-camera-moves.md +43 -0
  357. package/lib/motion/shotcraft/upstream/references/shots/camera/terminal-3d.md +42 -0
  358. package/lib/motion/shotcraft/upstream/references/shots/data/before-after-slider-scrub.md +48 -0
  359. package/lib/motion/shotcraft/upstream/references/shots/data/chart-live-moves.md +52 -0
  360. package/lib/motion/shotcraft/upstream/references/shots/data/gauge-readout-moves.md +45 -0
  361. package/lib/motion/shotcraft/upstream/references/shots/data/scroll-brake-moves.md +46 -0
  362. package/lib/motion/shotcraft/upstream/references/shots/data/timeline-travel.md +44 -0
  363. package/lib/motion/shotcraft/upstream/references/shots/effects/assemble-then-type-flyin.md +63 -0
  364. package/lib/motion/shotcraft/upstream/references/shots/effects/aurora-bloom-bg-flip.md +54 -0
  365. package/lib/motion/shotcraft/upstream/references/shots/effects/brand-frame-snap.md +58 -0
  366. package/lib/motion/shotcraft/upstream/references/shots/effects/fui-hud-moves.md +35 -0
  367. package/lib/motion/shotcraft/upstream/references/shots/effects/glow-flyline-moves.md +53 -0
  368. package/lib/motion/shotcraft/upstream/references/shots/effects/icon-performance-moves.md +42 -0
  369. package/lib/motion/shotcraft/upstream/references/shots/effects/impact-feedback.md +50 -0
  370. package/lib/motion/shotcraft/upstream/references/shots/effects/light-play-moves.md +46 -0
  371. package/lib/motion/shotcraft/upstream/references/shots/effects/radial-ripple-phone-chips.md +56 -0
  372. package/lib/motion/shotcraft/upstream/references/shots/effects/riso-print-hits.md +49 -0
  373. package/lib/motion/shotcraft/upstream/references/shots/effects/scan-bracket-sweep.md +50 -0
  374. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-annotate-focus.md +53 -0
  375. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-assemble-flyin.md +53 -0
  376. package/lib/motion/shotcraft/upstream/references/shots/effects/slam-entrance-moves.md +55 -0
  377. package/lib/motion/shotcraft/upstream/references/shots/effects/spotlight-sweep-moves.md +52 -0
  378. package/lib/motion/shotcraft/upstream/references/shots/interaction/autolayout-gap-dial.md +60 -0
  379. package/lib/motion/shotcraft/upstream/references/shots/interaction/canvas-materialize-moves.md +57 -0
  380. package/lib/motion/shotcraft/upstream/references/shots/interaction/chip-grid-single-select-blackout.md +51 -0
  381. package/lib/motion/shotcraft/upstream/references/shots/interaction/collab-cursor-moves.md +41 -0
  382. package/lib/motion/shotcraft/upstream/references/shots/interaction/glass-pill-dictation-typing.md +53 -0
  383. package/lib/motion/shotcraft/upstream/references/shots/interaction/hashtag-to-pill-materialize.md +60 -0
  384. package/lib/motion/shotcraft/upstream/references/shots/interaction/picker-carousel-feature-cycle.md +55 -0
  385. package/lib/motion/shotcraft/upstream/references/shots/interaction/segmented-thumb-hero.md +57 -0
  386. package/lib/motion/shotcraft/upstream/references/shots/interaction/theme-switch-moves.md +47 -0
  387. package/lib/motion/shotcraft/upstream/references/shots/interaction/type-and-filter.md +37 -0
  388. package/lib/motion/shotcraft/upstream/references/shots/interaction/voice-waveform-live.md +54 -0
  389. package/lib/motion/shotcraft/upstream/references/shots/opening/brand-ink-open.md +36 -0
  390. package/lib/motion/shotcraft/upstream/references/shots/opening/crane-rise-reveal.md +56 -0
  391. package/lib/motion/shotcraft/upstream/references/shots/opening/dataviz-landscape-open.md +56 -0
  392. package/lib/motion/shotcraft/upstream/references/shots/opening/fracture.md +40 -0
  393. package/lib/motion/shotcraft/upstream/references/shots/opening/icon-field-colorize.md +60 -0
  394. package/lib/motion/shotcraft/upstream/references/shots/opening/letterspace-materialize.md +57 -0
  395. package/lib/motion/shotcraft/upstream/references/shots/opening/magician-card-flourish.md +73 -0
  396. package/lib/motion/shotcraft/upstream/references/shots/opening/orbit-ring-title-open.md +87 -0
  397. package/lib/motion/shotcraft/upstream/references/shots/opening/spotlight-hero-card.md +55 -0
  398. package/lib/motion/shotcraft/upstream/references/shots/opening/stroke-segment-build.md +50 -0
  399. package/lib/motion/shotcraft/upstream/references/shots/opening/text-as-mask.md +59 -0
  400. package/lib/motion/shotcraft/upstream/references/shots/outro/grain-dissolve.md +38 -0
  401. package/lib/motion/shotcraft/upstream/references/shots/outro/logo-shrink-wordmark-lockup.md +38 -0
  402. package/lib/motion/shotcraft/upstream/references/shots/outro/neon-triple-marquee.md +59 -0
  403. package/lib/motion/shotcraft/upstream/references/shots/outro/outro-group-photo-launch.md +39 -0
  404. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-strip-away-outro.md +61 -0
  405. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-to-brand-morph.md +52 -0
  406. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-cut-moves.md +50 -0
  407. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-step-list-theme-cycle.md +66 -0
  408. package/lib/motion/shotcraft/upstream/references/shots/rhythm/panel-grid-moves.md +43 -0
  409. package/lib/motion/shotcraft/upstream/references/shots/rhythm/quad-split-parallel-scenes.md +38 -0
  410. package/lib/motion/shotcraft/upstream/references/shots/rhythm/rhythm-interrupt-moves.md +38 -0
  411. package/lib/motion/shotcraft/upstream/references/shots/rhythm/sakuga-timing-shift.md +56 -0
  412. package/lib/motion/shotcraft/upstream/references/shots/rhythm/speed-ramp-freeze.md +44 -0
  413. package/lib/motion/shotcraft/upstream/references/shots/rhythm/trailer-grammar-moves.md +38 -0
  414. package/lib/motion/shotcraft/upstream/references/shots/transition/bottom-push-stack-wipe.md +63 -0
  415. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flip-reveal.md +57 -0
  416. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flock-tumble.md +63 -0
  417. package/lib/motion/shotcraft/upstream/references/shots/transition/circle-match-iris.md +58 -0
  418. package/lib/motion/shotcraft/upstream/references/shots/transition/gradient-transition.md +45 -0
  419. package/lib/motion/shotcraft/upstream/references/shots/transition/line-carry-transition.md +55 -0
  420. package/lib/motion/shotcraft/upstream/references/shots/transition/mosaic-reframe.md +49 -0
  421. package/lib/motion/shotcraft/upstream/references/shots/transition/page-turn-transitions.md +42 -0
  422. package/lib/motion/shotcraft/upstream/references/shots/transition/print-texture-transitions.md +42 -0
  423. package/lib/motion/shotcraft/upstream/references/shots/transition/shot-transitions.md +45 -0
  424. package/lib/motion/shotcraft/upstream/references/shots/transition/tear-streak-transitions.md +48 -0
  425. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-hidden-cut.md +55 -0
  426. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-travel.md +43 -0
  427. package/lib/motion/shotcraft/upstream/references/shots/transition/white-flash-logo-simplify-cut.md +41 -0
  428. package/lib/motion/shotcraft/upstream/references/shots/transition/wipe-transitions.md +42 -0
  429. package/lib/motion/shotcraft/upstream/references/shots/typography/blur-slide.md +59 -0
  430. package/lib/motion/shotcraft/upstream/references/shots/typography/brace-expand.md +55 -0
  431. package/lib/motion/shotcraft/upstream/references/shots/typography/countdown-arc-scatter.md +65 -0
  432. package/lib/motion/shotcraft/upstream/references/shots/typography/document-typewriter-reveal.md +42 -0
  433. package/lib/motion/shotcraft/upstream/references/shots/typography/flying-words.md +64 -0
  434. package/lib/motion/shotcraft/upstream/references/shots/typography/glitch-cycle.md +64 -0
  435. package/lib/motion/shotcraft/upstream/references/shots/typography/gradient-word-sweep.md +54 -0
  436. package/lib/motion/shotcraft/upstream/references/shots/typography/lead-word-zoom-assemble.md +91 -0
  437. package/lib/motion/shotcraft/upstream/references/shots/typography/marker-underline-title.md +51 -0
  438. package/lib/motion/shotcraft/upstream/references/shots/typography/outline-word-fill.md +66 -0
  439. package/lib/motion/shotcraft/upstream/references/shots/typography/paper-title-card.md +38 -0
  440. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-chip-slot-cycle-handled.md +66 -0
  441. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-slot-cycle.md +58 -0
  442. package/lib/motion/shotcraft/upstream/references/shots/typography/text-column-converge.md +61 -0
  443. package/lib/motion/shotcraft/upstream/references/shots/typography/title-demote-to-label.md +64 -0
  444. package/lib/motion/shotcraft/upstream/references/shots/typography/type-assembly-moves.md +45 -0
  445. package/lib/motion/shotcraft/upstream/references/shots/typography/type-entrance-moves.md +41 -0
  446. package/lib/motion/shotcraft/upstream/references/shots/typography/type-rhythm-sync.md +51 -0
  447. package/lib/motion/shotcraft/upstream/references/shots/typography/typewriter-moves.md +42 -0
  448. package/lib/motion/shotcraft/upstream/references/shots/typography/vertical-word-roll-blur-cycle.md +63 -0
  449. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-filmstrip.md +57 -0
  450. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-geometry.md +75 -0
  451. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/avatar-bracket-carousel.md +59 -0
  452. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/bezier-source-converge-merge.md +67 -0
  453. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/card-stack.md +60 -0
  454. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/carousel-3d.md +66 -0
  455. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/cloner-depth-echo.md +40 -0
  456. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/deck-deal-flyin.md +45 -0
  457. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/doc-park-left-pill-deal.md +62 -0
  458. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/draw-svg-trace.md +55 -0
  459. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/element-body-moves.md +37 -0
  460. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/integration-hub-map.md +55 -0
  461. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-reveal.md +50 -0
  462. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-stack-press.md +43 -0
  463. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-forerun.md +55 -0
  464. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-orbit-drop.md +51 -0
  465. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/page-waterfall-wall.md +51 -0
  466. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/product-card-progressive-assemble.md +56 -0
  467. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/radial-wave.md +49 -0
  468. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/research-card-stack-scroll.md +57 -0
  469. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/row-embed.md +36 -0
  470. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/value-stagger-gradient.md +64 -0
  471. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/wall-reveal-moves.md +47 -0
  472. package/lib/motion/shotcraft/upstream/references/sound-design.md +170 -0
  473. package/lib/motion/shotcraft/upstream/references/workbench.md +157 -0
  474. package/lib/motion/shotcraft/upstream/template/TEMPLATE.md +103 -0
  475. package/lib/motion/shotcraft/upstream/template/THEMES.md +44 -0
  476. package/lib/motion/shotcraft/upstream/template/package.json +20 -0
  477. package/lib/motion/shotcraft/upstream/template/remotion.config.ts +6 -0
  478. package/lib/motion/shotcraft/upstream/template/src/Root.tsx +17 -0
  479. package/lib/motion/shotcraft/upstream/template/src/aifl/Caption.tsx +65 -0
  480. package/lib/motion/shotcraft/upstream/template/src/aifl/DigitRoll.tsx +48 -0
  481. package/lib/motion/shotcraft/upstream/template/src/aifl/FlashCut.tsx +24 -0
  482. package/lib/motion/shotcraft/upstream/template/src/aifl/Main.tsx +192 -0
  483. package/lib/motion/shotcraft/upstream/template/src/aifl/PaperTitleCard.tsx +111 -0
  484. package/lib/motion/shotcraft/upstream/template/src/aifl/live/PageCam.tsx +150 -0
  485. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneDetail.tsx +158 -0
  486. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneFlyIn.tsx +468 -0
  487. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOpen.tsx +552 -0
  488. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOutroLive.tsx +411 -0
  489. package/lib/motion/shotcraft/upstream/template/src/aifl/live/ScenePapers.tsx +200 -0
  490. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneWbr.tsx +324 -0
  491. package/lib/motion/shotcraft/upstream/template/src/aifl/live-layout.json +389 -0
  492. package/lib/motion/shotcraft/upstream/template/src/index.ts +4 -0
  493. package/lib/motion/shotcraft/upstream/template/src/themes/ThemedFilm.tsx +7 -0
  494. package/lib/motion/shotcraft/upstream/template/src/themes/manifest.tsx +68 -0
  495. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.json +1 -0
  496. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.ts +24 -0
  497. package/lib/motion/shotcraft/upstream/template/src/themes/palettes.json +74 -0
  498. package/lib/motion/shotcraft/upstream/template/src/themes/visual-theme.tsx +91 -0
  499. package/lib/motion/shotcraft/upstream/template/src/workbench.ts +213 -0
  500. package/lib/motion/shotcraft/upstream/template/tsconfig.json +15 -0
  501. package/lib/motion/spec.js +113 -0
  502. package/lib/motion/style-engine.js +153 -0
  503. package/lib/motion/style-frames.js +268 -0
  504. package/lib/motion/sync.js +214 -0
  505. package/lib/motion/theme.js +121 -0
  506. package/lib/motion/voice.js +417 -0
  507. package/lib/motion-agent-files.js +82 -0
  508. package/lib/motion-agent-protocol.js +66 -0
  509. package/lib/motion-agent-tools.js +196 -0
  510. package/lib/motion-agent.js +171 -0
  511. package/lib/motion-capture.js +92 -0
  512. package/lib/motion-core.js +238 -0
  513. package/lib/motion-film-review.js +71 -0
  514. package/lib/motion-library.js +210 -0
  515. package/lib/motion-planner.js +254 -0
  516. package/lib/motion-project.js +80 -0
  517. package/lib/motion-render-worker.js +145 -0
  518. package/lib/motion-session.js +32 -0
  519. package/lib/motion-source.js +49 -0
  520. package/lib/motion-tasks.js +452 -0
  521. package/lib/motion-vision.js +43 -0
  522. package/lib/mxfile.js +27 -7
  523. package/lib/routing/node-runtime.js +14 -0
  524. package/lib/routing/router.js +211 -0
  525. package/lib/routing/vendor/README.md +96 -0
  526. package/lib/routing/vendor/libavoid-routing.js +753 -0
  527. package/lib/routing/vendor/libavoid.min.js +59 -0
  528. package/lib/shotcard-core.js +39 -0
  529. package/lib/shotcard-reference.js +56 -0
  530. package/lib/style-kernel.js +37 -3
  531. package/lib/task-patches.js +26 -2
  532. package/lib/video-export.js +17 -2
  533. package/package.json +29 -4
@@ -0,0 +1,315 @@
1
+ // overhead-tabletop-drop|上帝视角桌面滑降(第二轮重设计)
2
+ // 手法不变:三张页面卡平躺成桌面卡阵,相机俯拍横滑巡视(只动 translateX,角度锁死),
3
+ // 滑过目标后一拍停顿,骤降扎入——rotateX / scale / translateX 三通道同跑,抬正成满屏。
4
+ //
5
+ // 设计决定
6
+ // - look:graphite(近单色暗场 · 白 · 一点香槟金)。桌面是深石墨哑光台面,三盏顶灯在台面上各打一个
7
+ // 光池,页面像三张刚打印出来的样稿摆在评审桌上——暗桌白纸,反差即层次。台面有发丝网格 + 每张样稿下方
8
+ // 一枚印刷标签(01 SHOTS / 02 HOME / 03 CHANGELOG),横滑时它们是"相机在动"的参照。
9
+ // - 内容:video-shotcraft 官网的三页——镜头库、首页、更新日志。每页为镜头重新排版:大标题、少元素、
10
+ // 真实感文案。目标是中间的首页,落版满屏时它就是一张海报:150px 两行品牌短句 + 右侧分镜板产品图。
11
+ // - 节奏:巡视(50f 缓入缓出)→ 选定(停 8f:目标稿离桌 16px、它的顶灯更亮、另外两盏灯暗下去)→
12
+ // 骤降(28f,零速起步的不对称曲线,scale 带 ~5% 预备回缩)→ 软回落版(8f)→ 落版后页面里的
13
+ // 产品图完成一个小动作:金色「Hero shot」镜头块滑入分镜板空槽、轻过冲落座 → hold。
14
+ // - Q2:卡片按落版尺寸 2× 布局栅格化、再在平面内缩回 0.5 摆上桌,扎入满屏时文字是原生分辨率。
15
+ //
16
+ // 时间表(30fps,共 140f)
17
+ // 0–50 横滑巡视:translateX +760→−360(smooth,滑过目标约 1/3 身位),角度锁 62°
18
+ // 44–60 选定:目标稿离桌 16px、影子变大变虚;左右两盏顶灯降到 35%,目标灯 +25%
19
+ // 58–86 骤降扎入:rotateX 62→−1.6、scale 1→2.04(预备回缩 ~5%)、translateX −360→0 三通道同跑
20
+ // 86–94 软回 0° / 2.0 正视满屏;目标稿同时落回桌面
21
+ // 98–118 页面内:金色镜头块从右侧滑入空槽(snappy + 一次过冲),同列一块让位下移
22
+ // 94–140 hold:极缓推近 1→1.012,尾帧是 video-shotcraft 首页海报
23
+ import React from 'react';
24
+ import { AbsoluteFill, useCurrentFrame } from 'remotion';
25
+ import { LOOKS, alpha, type } from '../../_fixtures/Look';
26
+ import { EASE, FONT, Grain, Vignette, bezier, mix, ramp, softShadow } from '../../_fixtures/Polish';
27
+ import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
28
+
29
+ export const OVERHEAD_TABLETOP_DROP_DURATION = 140;
30
+
31
+ const L = LOOKS.graphite;
32
+ const PAPER = '#f4f1ea'; // 样稿纸色(暖白,不用纯白)
33
+ const INK = '#141414';
34
+ const INK2 = '#5f5c56';
35
+ const INK3 = '#9b968c';
36
+ const RULE = 'rgba(20,20,20,0.1)';
37
+ const GOLD = '#b8893a'; // 纸上的金(比 look 的香槟金深一档,白底可读)
38
+ const SERIF_STACK = '"Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif';
39
+
40
+ const CARD_W = 996;
41
+ const CARD_H = 560;
42
+ const GAP = 150;
43
+ const PITCH = CARD_W + GAP;
44
+ const RES = 2; // 卡片按落版倍率布局(1992×1120)后平面内缩回 0.5
45
+ const INNER = (CARD_H * RES) / 1080; // 1.037:1920×1080 设计稿在 2x 卡内铺满
46
+
47
+ const PAN_END = 50;
48
+ const DROP = 58;
49
+ const DROP_END = 86;
50
+ const SETTLE_END = 94;
51
+
52
+ const DIVE = bezier(0.36, 0, 0.12, 1); // 零速起步、快速加速、长减速落位
53
+ const DIVE_SCALE = bezier(0.45, -0.18, 0.12, 1); // 先回缩 ~5%(机位微抬)再扎
54
+
55
+ // ───────────── 三页样稿(1920×1080 设计坐标) ─────────────
56
+
57
+ const Nav: React.FC<{ active: string }> = ({ active }) => (
58
+ <div style={{ position: 'absolute', left: 150, right: 150, top: 60, height: 64, display: 'flex', alignItems: 'center', fontFamily: FONT.sans }}>
59
+ <ShotcraftMark size={44} tone="light" style={{ marginRight: 14, flex: 'none' }} />
60
+ <div style={{ ...type(32, 700), fontFamily: BRAND.font, letterSpacing: '0.03em', color: INK }}>{BRAND.name}</div>
61
+ <div style={{ display: 'flex', gap: 46, marginLeft: 90, ...type(26, 550), color: INK2 }}>
62
+ {['Product', 'Shots', 'Changelog', 'Docs'].map((n) => (
63
+ <span key={n} style={{ color: n === active ? INK : INK2, fontWeight: n === active ? 700 : 550 }}>{n}</span>
64
+ ))}
65
+ </div>
66
+ <div style={{ marginLeft: 'auto', padding: '16px 30px', borderRadius: 999, background: INK, color: PAPER, ...type(24, 650) }}>View on GitHub</div>
67
+ </div>
68
+ );
69
+
70
+ // 首页右侧产品图:一支宣传片的分镜板(五幕 × 镜头块);slot = 金色「Hero shot」块的滑入进度
71
+ const DAYS = ['Open', 'Hook', 'Demo', 'Proof', 'Outro'];
72
+ const BLOCKS: { d: number; y: number; h: number; t: string }[] = [
73
+ { d: 0, y: 40, h: 120, t: 'Tilt reveal' },
74
+ { d: 1, y: 190, h: 150, t: 'Crash zoom' },
75
+ { d: 2, y: 60, h: 100, t: 'Whip pan' },
76
+ { d: 3, y: 230, h: 120, t: 'Drone dive' },
77
+ { d: 4, y: 40, h: 140, t: 'Logo sting' },
78
+ { d: 0, y: 300, h: 110, t: 'Title card' },
79
+ { d: 4, y: 290, h: 110, t: 'End card' },
80
+ ];
81
+ const Planner: React.FC<{ slot: number }> = ({ slot }) => {
82
+ const colW = 126;
83
+ const x0 = 38;
84
+ const s = Math.max(0, slot);
85
+ return (
86
+ <div style={{
87
+ position: 'absolute', left: 1080, top: 250, width: 690, height: 600, borderRadius: 28, background: '#1a1a1c',
88
+ boxShadow: '0 40px 80px -30px rgba(20,16,8,0.55), 0 0 0 1px rgba(0,0,0,0.2)', overflow: 'hidden', fontFamily: FONT.sans,
89
+ }}>
90
+ <div style={{ position: 'absolute', left: 40, top: 32, ...type(30, 700), color: '#f4f4f2' }}>Launch film</div>
91
+ <div style={{ position: 'absolute', right: 40, top: 36, ...type(24, 550), color: '#8f8c86' }}>0:42 · 30 fps</div>
92
+ {DAYS.map((d, i) => (
93
+ <div key={d} style={{ position: 'absolute', left: x0 + i * colW, top: 96, width: colW - 12, ...type(22, 650, { caps: true }), color: '#8f8c86', letterSpacing: '0.12em' }}>{d}</div>
94
+ ))}
95
+ <div style={{ position: 'absolute', left: 40, right: 40, top: 132, height: 1, background: 'rgba(255,255,255,0.1)' }} />
96
+ <div style={{ position: 'absolute', left: 0, top: 150, width: 700, height: 440 }}>
97
+ {BLOCKS.map((b, i) => {
98
+ // Demo 列(d=2)的块在金色块落座时让位下移
99
+ const push = b.d === 2 ? 150 * s : 0;
100
+ return (
101
+ <div key={i} style={{
102
+ position: 'absolute', left: x0 + b.d * colW, top: b.y + push, width: colW - 12, height: b.h, borderRadius: 14,
103
+ background: '#2a2a2d', boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.06)', padding: '14px 14px', boxSizing: 'border-box',
104
+ ...type(22, 600), color: '#c9c6bf', lineHeight: 1.18,
105
+ }}>{b.t}</div>
106
+ );
107
+ })}
108
+ {/* 金色镜头块:从右侧画外滑入 Demo 列的空槽 */}
109
+ <div style={{
110
+ position: 'absolute', left: mix(760, x0 + 2 * colW, slot), top: 60, width: colW - 12, height: 136, borderRadius: 14,
111
+ background: 'linear-gradient(180deg, #e8c983 0%, #d4a85a 100%)', padding: '14px 14px', boxSizing: 'border-box',
112
+ boxShadow: `0 ${12 + 18 * (1 - s)}px ${26 + 20 * (1 - s)}px -8px rgba(212,168,90,0.45), inset 0 1px 0 rgba(255,255,255,0.5)`,
113
+ ...type(22, 750), color: '#2a1e08', lineHeight: 1.18,
114
+ }}>Hero shot<div style={{ ...type(19, 650), color: 'rgba(42,30,8,0.65)', marginTop: 8 }}>120f</div></div>
115
+ </div>
116
+ </div>
117
+ );
118
+ };
119
+
120
+ const HomePage: React.FC<{ slot: number }> = ({ slot }) => (
121
+ <div style={{ position: 'absolute', inset: 0, background: PAPER, fontFamily: FONT.sans }}>
122
+ <Nav active="Product" />
123
+ <div style={{ position: 'absolute', left: 150, top: 290 }}>
124
+ <div style={{ display: 'flex', alignItems: 'center', gap: 16, ...type(24, 700, { caps: true }), color: GOLD, letterSpacing: '0.18em' }}>
125
+ <div style={{ width: 36, height: 2, background: GOLD }} />For Claude Code &amp; Codex
126
+ </div>
127
+ <div style={{ ...type(148, 800), color: INK, marginTop: 34, lineHeight: 0.98, letterSpacing: '-0.05em' }}>
128
+ Frame motion.<br /><span style={{ fontFamily: SERIF_STACK, fontStyle: 'italic', fontWeight: 400, letterSpacing: '-0.03em' }}>Craft the shot.</span>
129
+ </div>
130
+ <div style={{ ...type(34, 450), color: INK2, marginTop: 44, width: 860, lineHeight: 1.4 }}>
131
+ Cinematic product videos, crafted by your agent. From screenshot to showreel.
132
+ </div>
133
+ <div style={{ display: 'flex', gap: 22, marginTop: 52 }}>
134
+ <div style={{ padding: '22px 40px', borderRadius: 999, background: INK, color: PAPER, ...type(28, 650) }}>Get the skill</div>
135
+ <div style={{ padding: '22px 40px', borderRadius: 999, boxShadow: `inset 0 0 0 2px ${RULE}`, color: INK, ...type(28, 600) }}>Watch the film →</div>
136
+ </div>
137
+ </div>
138
+ <Planner slot={slot} />
139
+ </div>
140
+ );
141
+
142
+ // 镜头库页:三张镜头配方卡(名字 / 时长 / 一句话),版式沿用三栏卡
143
+ const PLANS = [
144
+ { n: 'Crash zoom', p: '2s', u: '60 frames', d: 'Punch in on the one number that matters.' },
145
+ { n: 'Drone dive', p: '4s', u: '120 frames', d: 'Fall from the overview straight into the hero.', hi: true },
146
+ { n: 'Whip pan', p: '1s', u: '30 frames', d: 'Cut between pages at full speed.' },
147
+ ];
148
+ const ShotsPage: React.FC = () => (
149
+ <div style={{ position: 'absolute', inset: 0, background: PAPER, fontFamily: FONT.sans }}>
150
+ <Nav active="Shots" />
151
+ <div style={{ position: 'absolute', left: 0, right: 0, top: 200, textAlign: 'center', ...type(104, 800), color: INK, letterSpacing: '-0.045em' }}>Pick a shot.</div>
152
+ <div style={{ position: 'absolute', left: 0, right: 0, top: 336, textAlign: 'center', ...type(32, 450), color: INK2 }}>Shot recipes for cinematic product films.</div>
153
+ <div style={{ position: 'absolute', left: 200, right: 200, top: 450, display: 'flex', gap: 40 }}>
154
+ {PLANS.map((pl) => (
155
+ <div key={pl.n} style={{
156
+ flex: 1, height: 500, borderRadius: 28, padding: '44px 44px', boxSizing: 'border-box',
157
+ background: pl.hi ? INK : '#fbf9f4', color: pl.hi ? PAPER : INK,
158
+ boxShadow: pl.hi ? '0 30px 60px -24px rgba(20,16,8,0.5)' : `inset 0 0 0 2px ${RULE}`,
159
+ }}>
160
+ <div style={{ ...type(30, 650), color: pl.hi ? '#e4c58a' : INK2 }}>{pl.n}</div>
161
+ <div style={{ display: 'flex', alignItems: 'baseline', gap: 10, marginTop: 30 }}>
162
+ <div style={{ ...type(120, 800), letterSpacing: '-0.05em' }}>{pl.p}</div>
163
+ <div style={{ ...type(26, 500), opacity: 0.6 }}>/ {pl.u}</div>
164
+ </div>
165
+ <div style={{ ...type(28, 450), opacity: 0.72, marginTop: 30, lineHeight: 1.4 }}>{pl.d}</div>
166
+ </div>
167
+ ))}
168
+ </div>
169
+ </div>
170
+ );
171
+
172
+ const LOG = [
173
+ { v: '2.4', d: 'Sep 12', t: 'Motion workbench', b: 'Tune every shot on a timeline, then render in one click.' },
174
+ { v: '2.3', d: 'Aug 28', t: 'JianYing export', b: 'Hand the finished cut to your editor as a native draft.' },
175
+ { v: '2.2', d: 'Aug 09', t: 'Beat-synced cuts', b: 'Every cut lands on the music, frame-accurate.' },
176
+ ];
177
+ const ChangelogPage: React.FC = () => (
178
+ <div style={{ position: 'absolute', inset: 0, background: PAPER, fontFamily: FONT.sans }}>
179
+ <Nav active="Changelog" />
180
+ <div style={{ position: 'absolute', left: 150, top: 200, ...type(104, 800), color: INK, letterSpacing: '-0.045em' }}>Changelog</div>
181
+ <div style={{ position: 'absolute', left: 150, right: 150, top: 380 }}>
182
+ {LOG.map((e) => (
183
+ <div key={e.v} style={{ display: 'flex', gap: 60, padding: '38px 0', borderTop: `2px solid ${RULE}` }}>
184
+ <div style={{ width: 260 }}>
185
+ <div style={{ display: 'inline-block', padding: '8px 18px', borderRadius: 999, background: INK, color: PAPER, ...type(24, 700) }}>v{e.v}</div>
186
+ <div style={{ ...type(26, 500), color: INK3, marginTop: 14 }}>{e.d}</div>
187
+ </div>
188
+ <div>
189
+ <div style={{ ...type(48, 750), color: INK }}>{e.t}</div>
190
+ <div style={{ ...type(28, 450), color: INK2, marginTop: 12 }}>{e.b}</div>
191
+ </div>
192
+ </div>
193
+ ))}
194
+ </div>
195
+ </div>
196
+ );
197
+
198
+ // ───────────── 桌面 ─────────────
199
+
200
+ // 单张样稿:平躺在桌面上;lift = 离桌高度(px,沿桌面法线)
201
+ const PageCard: React.FC<{ x: number; lift?: number; children: React.ReactNode }> = ({ x, lift = 0, children }) => (
202
+ <div style={{
203
+ position: 'absolute', left: x - (CARD_W * RES) / 2, top: -(CARD_H * RES) / 2, width: CARD_W * RES, height: CARD_H * RES,
204
+ borderRadius: 10 * RES, overflow: 'hidden', boxSizing: 'border-box', background: PAPER,
205
+ boxShadow: `${softShadow((4 + lift * 1.6) * RES, { strength: 3.2, color: '#000000' })}, inset 0 ${RES}px 0 rgba(255,255,255,0.7)`,
206
+ backfaceVisibility: 'hidden', transform: `translateZ(${4 + lift}px) scale(${1 / RES})`,
207
+ }}>
208
+ <div style={{ width: 1920, height: 1080, zoom: INNER, position: 'relative' }}>{children}</div>
209
+ </div>
210
+ );
211
+
212
+ // 桌面上的印刷标签:编号 + 页名(等宽、全大写),贴在样稿下沿外
213
+ const DeskTag: React.FC<{ x: number; n: string; label: string; on: number }> = ({ x, n, label, on }) => (
214
+ <div style={{
215
+ position: 'absolute', left: x - CARD_W / 2, top: CARD_H / 2 + 34, width: CARD_W, display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 18,
216
+ fontFamily: FONT.mono, fontSize: 30, letterSpacing: '0.16em', color: alpha(L.ink, 0.42 + 0.5 * on), transform: 'translateZ(1px)',
217
+ }}>
218
+ <span style={{ color: on > 0.5 ? L.accent2 : alpha(L.ink, 0.5) }}>{n}</span>
219
+ <span style={{ flex: 'none', width: 40, height: 2, background: alpha(L.ink, 0.25) }} />
220
+ <span>{label}</span>
221
+ </div>
222
+ );
223
+
224
+ export const OverheadTabletopDrop: React.FC = () => {
225
+ const f = useCurrentFrame();
226
+
227
+ // 横滑:只动 translateX(角度锁死——巡视归巡视)
228
+ const panX = mix(760, -360, ramp(f, 0, PAN_END, EASE.smooth));
229
+ // 骤降:三通道同起同止
230
+ const d = ramp(f, DROP, DROP_END - DROP, DIVE);
231
+ const ds = ramp(f, DROP, DROP_END - DROP, DIVE_SCALE);
232
+ const rotX = f < DROP_END
233
+ ? mix(62, -1.6, d)
234
+ : f < 90
235
+ ? mix(-1.6, 0.5, ramp(f, DROP_END, 4, EASE.smooth))
236
+ : mix(0.5, 0, ramp(f, 90, 4, EASE.smooth));
237
+ const push = mix(1, 1.012, ramp(f, SETTLE_END, 46, EASE.smooth)); // 落版后极缓推近
238
+ const scale = (f < DROP_END ? mix(1, 2.04, ds) : mix(2.04, 2.0, ramp(f, DROP_END, SETTLE_END - DROP_END, EASE.smooth))) * push;
239
+ const tx = f <= DROP ? panX : mix(-360, 0, d);
240
+
241
+ // 选定:目标稿离桌、顶灯明暗
242
+ const pick = ramp(f, 44, 16, EASE.out);
243
+ const lift = 16 * (pick - ramp(f, 70, 18, EASE.smooth));
244
+ const tilt = Math.max(0, Math.min(1, rotX / 62));
245
+ // 页面内的小动作:金色日程块落座(snappy 位移 + overshoot 收尾)
246
+ const slot = ramp(f, 98, 20, EASE.overshoot);
247
+
248
+ // 顶灯光池(世界坐标,落在每张样稿上):选定后左右两盏暗下去
249
+ const pool = (x: number, k: number) =>
250
+ `radial-gradient(ellipse 820px 620px at ${2800 + x}px 3200px, ${alpha('#f2efe6', 0.2 * k)} 0%, ${alpha('#f2efe6', 0.07 * k)} 45%, ${alpha('#f2efe6', 0)} 75%)`;
251
+ const side = 1 - 0.65 * pick;
252
+ const hero = 1 + 0.25 * pick;
253
+
254
+ return (
255
+ <AbsoluteFill style={{ background: L.bg[2], overflow: 'hidden' }}>
256
+ <div style={{ position: 'absolute', inset: 0, perspective: 1600, perspectiveOrigin: '50% 42%' }}>
257
+ {/* 世界原点 = 屏心;先 in-plane scale,再 rotateX,最后 translateX */}
258
+ <div style={{
259
+ position: 'absolute', left: '50%', top: '50%', width: 0, height: 0, transformStyle: 'preserve-3d',
260
+ transform: `translateX(${tx}px) rotateX(${rotX}deg) scale(${scale})`,
261
+ }}>
262
+ {/* 台面:深石墨 + 三盏顶灯光池 + 发丝网格(细 80 / 粗 400) */}
263
+ <div style={{
264
+ position: 'absolute', left: -2800, top: -3200, width: 5600, height: 4100, backfaceVisibility: 'hidden',
265
+ background: [
266
+ pool(-PITCH, side), pool(0, hero), pool(PITCH, side),
267
+ 'repeating-linear-gradient(90deg, rgba(255,255,255,0.05) 0px, rgba(255,255,255,0.05) 1.5px, transparent 1.5px, transparent 400px)',
268
+ 'repeating-linear-gradient(0deg, rgba(255,255,255,0.05) 0px, rgba(255,255,255,0.05) 1.5px, transparent 1.5px, transparent 400px)',
269
+ 'repeating-linear-gradient(90deg, rgba(255,255,255,0.022) 0px, rgba(255,255,255,0.022) 1px, transparent 1px, transparent 80px)',
270
+ 'repeating-linear-gradient(0deg, rgba(255,255,255,0.022) 0px, rgba(255,255,255,0.022) 1px, transparent 1px, transparent 80px)',
271
+ `linear-gradient(180deg, ${L.bg[0]}, ${L.bg[1]})`,
272
+ ].join(', '),
273
+ }} />
274
+ <DeskTag x={-PITCH} n="01" label="SHOTS" on={0} />
275
+ <DeskTag x={0} n="02" label="HOME" on={pick} />
276
+ <DeskTag x={PITCH} n="03" label="CHANGELOG" on={0} />
277
+ <PageCard x={-PITCH}><ShotsPage /></PageCard>
278
+ <PageCard x={0} lift={lift}><HomePage slot={slot} /></PageCard>
279
+ <PageCard x={PITCH}><ChangelogPage /></PageCard>
280
+ {/* 左右样稿随顶灯变暗:盖一层台面色 */}
281
+ {[-PITCH, PITCH].map((x) => (
282
+ <div key={x} style={{
283
+ position: 'absolute', left: x - CARD_W / 2, top: -CARD_H / 2, width: CARD_W, height: CARD_H, borderRadius: 10,
284
+ background: L.bg[1], opacity: 0.08 + 0.34 * pick, transform: 'translateZ(5px)', pointerEvents: 'none',
285
+ }} />
286
+ ))}
287
+ </div>
288
+ </div>
289
+ {/* 顶灯光束(屏幕空间体积光):三盏灯各一束斜落到样稿上,跟着卡阵横移;扎入时随俯角散去 */}
290
+ {[-PITCH, 0, PITCH].map((x, i) => {
291
+ const k = (i === 1 ? hero : side) * tilt;
292
+ if (k < 0.02) return null;
293
+ const cx = 960 + tx + x * 0.92; // 卡阵中线 → 屏幕 x(透视下略收拢)
294
+ return (
295
+ <div key={x} style={{
296
+ position: 'absolute', left: cx - 560, top: -60, width: 1120, height: 560, pointerEvents: 'none', opacity: k,
297
+ filter: 'blur(26px)', mixBlendMode: 'screen',
298
+ }}>
299
+ <div style={{
300
+ position: 'absolute', inset: 0, clipPath: 'polygon(44% 0, 56% 0, 90% 100%, 10% 100%)',
301
+ background: `linear-gradient(180deg, ${alpha('#f2efe6', 0.22)} 0%, ${alpha('#f2efe6', 0.09)} 60%, ${alpha('#f2efe6', 0.0)} 100%)`,
302
+ }} />
303
+ </div>
304
+ );
305
+ })}
306
+ {/* 屏幕空间:远端(画面上部)沉入夜色,随俯角收起;暗角 + 颗粒 */}
307
+ <div style={{
308
+ position: 'absolute', inset: 0, pointerEvents: 'none',
309
+ background: `linear-gradient(180deg, ${alpha(L.bg[2], 0.95 * tilt)} 0%, ${alpha(L.bg[2], 0.55 * tilt)} 24%, ${alpha(L.bg[2], 0)} 48%)`,
310
+ }} />
311
+ <Vignette strength={0.12 + 0.45 * tilt} inner={0.45} color="#000000" />
312
+ <Grain opacity={0.04 + 0.05 * tilt} blend="soft-light" />
313
+ </AbsoluteFill>
314
+ );
315
+ };
@@ -0,0 +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
+ };