dsh-drawai 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/README.md +7 -5
  2. package/lib/client.js +142 -16
  3. package/lib/index.js +7945 -7719
  4. package/lib/motion/asset-pack.js +394 -394
  5. package/lib/motion/assets.js +291 -291
  6. package/lib/motion/demo-assets-lock.js +10 -10
  7. package/lib/motion/mgstyles/briefs/23-ink-wash.md +147 -0
  8. package/lib/motion/mgstyles/catalog.d/23-ink-wash.json +28 -0
  9. package/lib/motion/mgstyles/catalog.json +127 -14
  10. package/lib/motion/mgstyles/upstream/demos/23-ink-wash/brush.js +149 -0
  11. package/lib/motion/mgstyles/upstream/demos/23-ink-wash/film.js +202 -0
  12. package/lib/motion/mgstyles/upstream/manifest.json +28 -3
  13. package/lib/motion/mgstyles/upstream/prompts/23-ink-wash.md +59 -0
  14. package/lib/motion/mgstyles/vendor/README.md +28 -28
  15. package/lib/motion/mgstyles/vendor/modules/d3/LICENSE +13 -13
  16. package/lib/motion/mgstyles/vendor/modules/d3/dist/d3.min.js +2 -2
  17. package/lib/motion/mgstyles/vendor/modules/opentype.js/LICENSE +20 -20
  18. package/lib/motion/mgstyles/vendor/modules/opentype.js/dist/opentype.mjs +14460 -14460
  19. package/lib/motion/mgstyles/vendor/modules/simplex-noise/LICENSE +21 -21
  20. package/lib/motion/mgstyles/vendor/modules/simplex-noise/dist/esm/simplex-noise.js +465 -465
  21. package/lib/motion/mgstyles/vendor/modules/topojson-client/LICENSE +13 -13
  22. package/lib/motion/mgstyles/vendor/modules/topojson-client/dist/topojson-client.min.js +2 -2
  23. package/lib/motion/project.js +5 -1
  24. package/lib/motion/qa.js +116 -6
  25. package/lib/motion/render.js +179 -179
  26. package/lib/motion/scene-kit.js +1 -1
  27. package/lib/motion/shotcraft/upstream/SKILL.md +286 -286
  28. package/lib/motion/shotcraft/upstream/assets/lib/Caption.tsx +54 -54
  29. package/lib/motion/shotcraft/upstream/assets/lib/ClipCard.tsx +200 -200
  30. package/lib/motion/shotcraft/upstream/assets/lib/DigitRoll.tsx +45 -45
  31. package/lib/motion/shotcraft/upstream/assets/lib/FlashCut.tsx +20 -20
  32. package/lib/motion/shotcraft/upstream/assets/lib/FlatPanel.tsx +65 -65
  33. package/lib/motion/shotcraft/upstream/assets/lib/PageCam.tsx +151 -151
  34. package/lib/motion/shotcraft/upstream/assets/lib/VerticalTicker.tsx +129 -129
  35. package/lib/motion/shotcraft/upstream/assets/lib/helpers/camera.tsx +75 -75
  36. package/lib/motion/shotcraft/upstream/assets/lib/helpers/motion.ts +40 -40
  37. package/lib/motion/shotcraft/upstream/assets/lib/helpers/rand.ts +11 -11
  38. package/lib/motion/shotcraft/upstream/assets/lib/helpers/shake.ts +10 -10
  39. package/lib/motion/shotcraft/upstream/assets/scripts/build-readme-cover.mjs +49 -49
  40. package/lib/motion/shotcraft/upstream/assets/scripts/capture-template.mjs +210 -210
  41. package/lib/motion/shotcraft/upstream/assets/scripts/sfx-source.py +423 -423
  42. package/lib/motion/shotcraft/upstream/assets/scripts/smoke-render-demos.py +170 -170
  43. package/lib/motion/shotcraft/upstream/assets/scripts/test_sfx_source.py +157 -157
  44. package/lib/motion/shotcraft/upstream/demos/README.md +120 -120
  45. package/lib/motion/shotcraft/upstream/demos/_fixtures/Brand.tsx +112 -112
  46. package/lib/motion/shotcraft/upstream/demos/_fixtures/Fixtures.tsx +647 -647
  47. package/lib/motion/shotcraft/upstream/demos/_fixtures/Look.tsx +316 -316
  48. package/lib/motion/shotcraft/upstream/demos/_fixtures/Motion.tsx +82 -82
  49. package/lib/motion/shotcraft/upstream/demos/_fixtures/PageCam2D.tsx +115 -115
  50. package/lib/motion/shotcraft/upstream/demos/_fixtures/Polish.tsx +243 -243
  51. package/lib/motion/shotcraft/upstream/demos/_textures/live-layout.json +388 -388
  52. package/lib/motion/shotcraft/upstream/demos/camera/basic-3d-scene/Basic3DScene.tsx +250 -250
  53. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashImpactReal.tsx +305 -305
  54. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashZoomReal.tsx +246 -246
  55. package/lib/motion/shotcraft/upstream/demos/camera/cursor-flyover/CursorFlyover.tsx +390 -390
  56. package/lib/motion/shotcraft/upstream/demos/camera/depth-layer-moves/MultiplaneReal.tsx +138 -138
  57. package/lib/motion/shotcraft/upstream/demos/camera/graze-face-tour/GrazeFaceTour.tsx +542 -542
  58. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/OverheadTabletopDrop.tsx +315 -315
  59. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/TiltReveal.tsx +299 -299
  60. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/DroneDiveLanding.tsx +173 -173
  61. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/ExplodedView.tsx +348 -348
  62. package/lib/motion/shotcraft/upstream/demos/camera/steep-tilt-glide/SteepTiltGlide.tsx +366 -366
  63. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx +279 -279
  64. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/PullBackIsolation.tsx +184 -184
  65. package/lib/motion/shotcraft/upstream/demos/camera/terminal-3d/Terminal3D.tsx +390 -390
  66. package/lib/motion/shotcraft/upstream/demos/data/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +155 -155
  67. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/AxisRescaleShockV2.tsx +303 -303
  68. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/OscilloscopeStreamV2.tsx +290 -290
  69. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/UnitDotSwarmRegroupV2.tsx +278 -278
  70. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/NeedleSweepSelftest.tsx +307 -307
  71. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/TapeScrollFixedPointer.tsx +215 -215
  72. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/BrakeReticleLock.tsx +299 -299
  73. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/ChangelogScrollBrake.tsx +232 -232
  74. package/lib/motion/shotcraft/upstream/demos/data/timeline-travel/TimelineTravel.tsx +290 -290
  75. package/lib/motion/shotcraft/upstream/demos/effects/assemble-then-type-flyin/AssembleThenTypeFlyin.tsx +273 -273
  76. package/lib/motion/shotcraft/upstream/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx +167 -167
  77. package/lib/motion/shotcraft/upstream/demos/effects/brand-frame-snap/BrandFrameSnap.tsx +536 -536
  78. package/lib/motion/shotcraft/upstream/demos/effects/fui-hud-moves/ReticleLockOn.tsx +164 -164
  79. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/FlylineArc.tsx +175 -175
  80. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/GlowOrbAmbient.tsx +197 -197
  81. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/OrbFlylineRelay.tsx +241 -241
  82. package/lib/motion/shotcraft/upstream/demos/effects/icon-performance-moves/AttentionBounce.tsx +279 -279
  83. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/AnimeImpact.tsx +230 -230
  84. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/HitCounter.tsx +345 -345
  85. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SheenSweepRetry.tsx +275 -275
  86. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SpotlightSweepReveal.tsx +229 -229
  87. package/lib/motion/shotcraft/upstream/demos/effects/radial-ripple-phone-chips/RadialRipplePhoneChips.tsx +312 -312
  88. package/lib/motion/shotcraft/upstream/demos/effects/riso-print-hits/RisoMisregistrationHit.tsx +222 -222
  89. package/lib/motion/shotcraft/upstream/demos/effects/scan-bracket-sweep/ScanBracketSweep.tsx +295 -295
  90. package/lib/motion/shotcraft/upstream/demos/effects/scanline-annotate-focus/ScanlineAnnotateFocus.tsx +329 -329
  91. package/lib/motion/shotcraft/upstream/demos/effects/scanline-assemble-flyin/ScanlineAssembleFlyin.tsx +315 -315
  92. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ImpactBurstKit.tsx +264 -264
  93. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/KanadaPerspectiveSnap.tsx +260 -260
  94. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ScoreSlam.tsx +263 -263
  95. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/CornerSpotlightReveal.tsx +123 -123
  96. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +187 -187
  97. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/SlideSpotlightPan.tsx +175 -175
  98. package/lib/motion/shotcraft/upstream/demos/interaction/autolayout-gap-dial/AutolayoutGapDial.tsx +305 -305
  99. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/DiagramCascadeBuild.tsx +350 -350
  100. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +352 -352
  101. package/lib/motion/shotcraft/upstream/demos/interaction/chip-grid-single-select-blackout/ChipGridSingleSelectBlackout.tsx +218 -218
  102. package/lib/motion/shotcraft/upstream/demos/interaction/collab-cursor-moves/CursorCastEnsemble.tsx +297 -297
  103. package/lib/motion/shotcraft/upstream/demos/interaction/glass-pill-dictation-typing/GlassPillDictationTyping.tsx +157 -157
  104. package/lib/motion/shotcraft/upstream/demos/interaction/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +218 -218
  105. package/lib/motion/shotcraft/upstream/demos/interaction/picker-carousel-feature-cycle/PickerCarouselFeatureCycle.tsx +202 -202
  106. package/lib/motion/shotcraft/upstream/demos/interaction/segmented-thumb-hero/SegmentedThumbHero.tsx +265 -265
  107. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/PaletteThemeRipple.tsx +457 -457
  108. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/ThemeSweepToggle.tsx +446 -446
  109. package/lib/motion/shotcraft/upstream/demos/interaction/type-and-filter/TypeAndFilter.tsx +249 -249
  110. package/lib/motion/shotcraft/upstream/demos/interaction/voice-waveform-live/VoiceWaveformLive.tsx +278 -278
  111. package/lib/motion/shotcraft/upstream/demos/opening/crane-rise-reveal/CraneRiseReveal.tsx +332 -332
  112. package/lib/motion/shotcraft/upstream/demos/opening/dataviz-landscape-open/DatavizLandscapeOpen.tsx +358 -358
  113. package/lib/motion/shotcraft/upstream/demos/opening/fracture/Fracture.tsx +201 -201
  114. package/lib/motion/shotcraft/upstream/demos/opening/icon-field-colorize/IconFieldColorize.tsx +200 -200
  115. package/lib/motion/shotcraft/upstream/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx +208 -208
  116. package/lib/motion/shotcraft/upstream/demos/opening/magician-card-flourish/MagicianCardFlourish.tsx +341 -341
  117. package/lib/motion/shotcraft/upstream/demos/opening/orbit-ring-title-open/OrbitRingTitleOpen.tsx +389 -389
  118. package/lib/motion/shotcraft/upstream/demos/opening/spotlight-hero-card/SpotlightHeroCard.tsx +293 -293
  119. package/lib/motion/shotcraft/upstream/demos/opening/stroke-segment-build/StrokeSegmentBuild.tsx +183 -183
  120. package/lib/motion/shotcraft/upstream/demos/opening/text-as-mask/TextAsMask.tsx +245 -245
  121. package/lib/motion/shotcraft/upstream/demos/outro/grain-dissolve/GrainDissolve.tsx +222 -222
  122. package/lib/motion/shotcraft/upstream/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx +223 -223
  123. package/lib/motion/shotcraft/upstream/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx +217 -217
  124. package/lib/motion/shotcraft/upstream/demos/outro/outro-group-photo-launch/OutroGroupPhotoLaunch.tsx +343 -343
  125. package/lib/motion/shotcraft/upstream/demos/outro/ui-strip-away-outro/UiStripAwayOutro.tsx +357 -357
  126. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/IconFlipBloomLogo.tsx +187 -187
  127. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/InputMorphsIntoLogo.tsx +333 -333
  128. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-cut-moves/PaparazziFlash.tsx +274 -274
  129. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +270 -270
  130. package/lib/motion/shotcraft/upstream/demos/rhythm/panel-grid-moves/ComicPanelSplit.tsx +430 -430
  131. package/lib/motion/shotcraft/upstream/demos/rhythm/quad-split-parallel-scenes/QuadSplitParallelScenes.tsx +252 -252
  132. package/lib/motion/shotcraft/upstream/demos/rhythm/rhythm-interrupt-moves/JumpCutPunchIn.tsx +106 -106
  133. package/lib/motion/shotcraft/upstream/demos/rhythm/sakuga-timing-shift/SakugaTimingShift.tsx +288 -288
  134. package/lib/motion/shotcraft/upstream/demos/rhythm/speed-ramp-freeze/FreezeAnnotateReal.tsx +362 -362
  135. package/lib/motion/shotcraft/upstream/demos/rhythm/trailer-grammar-moves/TrailerBumper.tsx +168 -168
  136. package/lib/motion/shotcraft/upstream/demos/transition/bottom-push-stack-wipe/BottomPushStackWipe.tsx +310 -310
  137. package/lib/motion/shotcraft/upstream/demos/transition/card-flip-reveal/CardFlipReveal.tsx +261 -261
  138. package/lib/motion/shotcraft/upstream/demos/transition/card-flock-tumble/CardFlockTumble.tsx +459 -459
  139. package/lib/motion/shotcraft/upstream/demos/transition/circle-match-iris/CircleMatchIris.tsx +294 -294
  140. package/lib/motion/shotcraft/upstream/demos/transition/gradient-transition/GradientTransition.tsx +161 -161
  141. package/lib/motion/shotcraft/upstream/demos/transition/line-carry-transition/LineCarryTransition.tsx +248 -248
  142. package/lib/motion/shotcraft/upstream/demos/transition/mosaic-reframe/MosaicReframe.tsx +359 -359
  143. package/lib/motion/shotcraft/upstream/demos/transition/page-turn-transitions/BarnDoorSplit.tsx +227 -227
  144. package/lib/motion/shotcraft/upstream/demos/transition/print-texture-transitions/InkBleedReveal.tsx +162 -162
  145. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/PortalWipeV2.tsx +248 -248
  146. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/WhipBrakeReal.tsx +186 -186
  147. package/lib/motion/shotcraft/upstream/demos/transition/tear-streak-transitions/GlitchDisplace.tsx +355 -355
  148. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/InvisibleCut.tsx +272 -272
  149. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/LightLeakBurn.tsx +262 -262
  150. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/VersusSlam.tsx +217 -217
  151. package/lib/motion/shotcraft/upstream/demos/transition/transition-travel/LetterformZoom.tsx +285 -285
  152. package/lib/motion/shotcraft/upstream/demos/transition/white-flash-logo-simplify-cut/WhiteFlashLogoSimplifyCut.tsx +205 -205
  153. package/lib/motion/shotcraft/upstream/demos/transition/wipe-transitions/BlindsSlice.tsx +178 -178
  154. package/lib/motion/shotcraft/upstream/demos/typography/blur-slide/BlurSlide.tsx +147 -147
  155. package/lib/motion/shotcraft/upstream/demos/typography/brace-expand/BraceExpand.tsx +143 -143
  156. package/lib/motion/shotcraft/upstream/demos/typography/brand-ink-open/BrandInkOpen.tsx +134 -134
  157. package/lib/motion/shotcraft/upstream/demos/typography/countdown-arc-scatter/CountdownArcScatter.tsx +217 -217
  158. package/lib/motion/shotcraft/upstream/demos/typography/flying-words/FlyingWords.tsx +198 -198
  159. package/lib/motion/shotcraft/upstream/demos/typography/glitch-cycle/GlitchCycle.tsx +221 -221
  160. package/lib/motion/shotcraft/upstream/demos/typography/gradient-word-sweep/GradientWordSweep.tsx +312 -312
  161. package/lib/motion/shotcraft/upstream/demos/typography/lead-word-zoom-assemble/LeadWordZoomAssemble.tsx +261 -261
  162. package/lib/motion/shotcraft/upstream/demos/typography/marker-underline-title/MarkerUnderlineTitle.tsx +121 -121
  163. package/lib/motion/shotcraft/upstream/demos/typography/outline-word-fill/OutlineWordFill.tsx +153 -153
  164. package/lib/motion/shotcraft/upstream/demos/typography/paper-title-card/PaperTitleCard.tsx +179 -179
  165. package/lib/motion/shotcraft/upstream/demos/typography/pill-chip-slot-cycle-handled/PillChipSlotCycleHandled.tsx +140 -140
  166. package/lib/motion/shotcraft/upstream/demos/typography/pill-slot-cycle/PillSlotCycle.tsx +309 -309
  167. package/lib/motion/shotcraft/upstream/demos/typography/text-column-converge/TextColumnConverge.tsx +191 -191
  168. package/lib/motion/shotcraft/upstream/demos/typography/title-demote-to-label/TitleDemoteToLabel.tsx +292 -292
  169. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/LetterformDriftAssembly.tsx +135 -135
  170. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/SplitTextStagger.tsx +124 -124
  171. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/TextOnPath.tsx +255 -255
  172. package/lib/motion/shotcraft/upstream/demos/typography/type-entrance-moves/LetterDropPhysics.tsx +173 -173
  173. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/FontWeightPump.tsx +225 -225
  174. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/KaraokeFillSync.tsx +141 -141
  175. package/lib/motion/shotcraft/upstream/demos/typography/typewriter-moves/TypewriterErrorRetype.tsx +137 -137
  176. package/lib/motion/shotcraft/upstream/demos/typography/vertical-word-roll-blur-cycle/VerticalWordRollBlurCycle.tsx +147 -147
  177. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-filmstrip/WordRelayFilmstrip.tsx +409 -409
  178. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-geometry/WordRelayGeometry.tsx +280 -280
  179. package/lib/motion/shotcraft/upstream/demos/ui-entrance/avatar-bracket-carousel/AvatarBracketCarousel.tsx +271 -271
  180. package/lib/motion/shotcraft/upstream/demos/ui-entrance/bezier-source-converge-merge/BezierSourceConvergeMerge.tsx +385 -385
  181. package/lib/motion/shotcraft/upstream/demos/ui-entrance/card-stack/CardStack.tsx +312 -312
  182. package/lib/motion/shotcraft/upstream/demos/ui-entrance/carousel-3d/Carousel3D.tsx +303 -303
  183. package/lib/motion/shotcraft/upstream/demos/ui-entrance/clipcard-looping/ClipCardLooping.tsx +77 -77
  184. package/lib/motion/shotcraft/upstream/demos/ui-entrance/cloner-depth-echo/ClonerDepthEcho.tsx +311 -311
  185. package/lib/motion/shotcraft/upstream/demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx +307 -307
  186. package/lib/motion/shotcraft/upstream/demos/ui-entrance/doc-park-left-pill-deal/DocParkLeftPillDeal.tsx +349 -349
  187. package/lib/motion/shotcraft/upstream/demos/ui-entrance/document-typewriter-reveal/DocumentTypewriterReveal.tsx +255 -255
  188. package/lib/motion/shotcraft/upstream/demos/ui-entrance/draw-svg-trace/DrawSvgTrace.tsx +244 -244
  189. package/lib/motion/shotcraft/upstream/demos/ui-entrance/element-body-moves/ContactShadowLift.tsx +217 -217
  190. package/lib/motion/shotcraft/upstream/demos/ui-entrance/integration-hub-map/IntegrationHubMap.tsx +652 -652
  191. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-reveal/ListReveal.tsx +153 -153
  192. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-stack-press/ListStackPress.tsx +238 -238
  193. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-forerun/NeonFrameForerun.tsx +324 -324
  194. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +354 -354
  195. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/PageWaterfallWall.tsx +101 -101
  196. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/VerticalTicker.tsx +129 -129
  197. package/lib/motion/shotcraft/upstream/demos/ui-entrance/product-card-progressive-assemble/ProductCardProgressiveAssemble.tsx +297 -297
  198. package/lib/motion/shotcraft/upstream/demos/ui-entrance/radial-wave/RadialWave.tsx +57 -57
  199. package/lib/motion/shotcraft/upstream/demos/ui-entrance/research-card-stack-scroll/ResearchCardStackScroll.tsx +155 -155
  200. package/lib/motion/shotcraft/upstream/demos/ui-entrance/row-embed/RowEmbed.tsx +175 -175
  201. package/lib/motion/shotcraft/upstream/demos/ui-entrance/value-stagger-gradient/ValueStaggerGradient.tsx +153 -153
  202. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/BentoLightUp.tsx +146 -146
  203. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/WireframeDrawOn.tsx +226 -226
  204. package/lib/motion/shotcraft/upstream/gallery/api/library.json +1 -1
  205. package/lib/motion/shotcraft/upstream/references/aesthetic-rules.md +193 -193
  206. package/lib/motion/shotcraft/upstream/references/final-review.md +121 -121
  207. package/lib/motion/shotcraft/upstream/references/guided-free-creation.md +199 -199
  208. package/lib/motion/shotcraft/upstream/references/jianying-export.md +183 -183
  209. package/lib/motion/shotcraft/upstream/references/music-beat-sync.md +257 -257
  210. package/lib/motion/shotcraft/upstream/references/pipeline.md +382 -382
  211. package/lib/motion/shotcraft/upstream/references/publish-upload-post.md +111 -111
  212. package/lib/motion/shotcraft/upstream/references/sequences/promo-energy-arc.md +50 -50
  213. package/lib/motion/shotcraft/upstream/references/sfx-sourcing.md +95 -95
  214. package/lib/motion/shotcraft/upstream/references/shots/camera/basic-3d-scene.md +41 -41
  215. package/lib/motion/shotcraft/upstream/references/shots/camera/crash-zoom-punch.md +52 -52
  216. package/lib/motion/shotcraft/upstream/references/shots/camera/cursor-flyover.md +39 -39
  217. package/lib/motion/shotcraft/upstream/references/shots/camera/depth-layer-moves.md +39 -39
  218. package/lib/motion/shotcraft/upstream/references/shots/camera/graze-face-tour.md +57 -57
  219. package/lib/motion/shotcraft/upstream/references/shots/camera/overhead-camera-moves.md +51 -51
  220. package/lib/motion/shotcraft/upstream/references/shots/camera/space-camera-moves.md +46 -46
  221. package/lib/motion/shotcraft/upstream/references/shots/camera/steep-tilt-glide.md +52 -52
  222. package/lib/motion/shotcraft/upstream/references/shots/camera/tension-camera-moves.md +43 -43
  223. package/lib/motion/shotcraft/upstream/references/shots/camera/terminal-3d.md +42 -42
  224. package/lib/motion/shotcraft/upstream/references/shots/data/before-after-slider-scrub.md +48 -48
  225. package/lib/motion/shotcraft/upstream/references/shots/data/chart-live-moves.md +52 -52
  226. package/lib/motion/shotcraft/upstream/references/shots/data/gauge-readout-moves.md +45 -45
  227. package/lib/motion/shotcraft/upstream/references/shots/data/scroll-brake-moves.md +46 -46
  228. package/lib/motion/shotcraft/upstream/references/shots/data/timeline-travel.md +44 -44
  229. package/lib/motion/shotcraft/upstream/references/shots/effects/assemble-then-type-flyin.md +63 -63
  230. package/lib/motion/shotcraft/upstream/references/shots/effects/aurora-bloom-bg-flip.md +54 -54
  231. package/lib/motion/shotcraft/upstream/references/shots/effects/brand-frame-snap.md +58 -58
  232. package/lib/motion/shotcraft/upstream/references/shots/effects/fui-hud-moves.md +35 -35
  233. package/lib/motion/shotcraft/upstream/references/shots/effects/glow-flyline-moves.md +53 -53
  234. package/lib/motion/shotcraft/upstream/references/shots/effects/icon-performance-moves.md +42 -42
  235. package/lib/motion/shotcraft/upstream/references/shots/effects/impact-feedback.md +50 -50
  236. package/lib/motion/shotcraft/upstream/references/shots/effects/light-play-moves.md +46 -46
  237. package/lib/motion/shotcraft/upstream/references/shots/effects/radial-ripple-phone-chips.md +56 -56
  238. package/lib/motion/shotcraft/upstream/references/shots/effects/riso-print-hits.md +49 -49
  239. package/lib/motion/shotcraft/upstream/references/shots/effects/scan-bracket-sweep.md +50 -50
  240. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-annotate-focus.md +53 -53
  241. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-assemble-flyin.md +53 -53
  242. package/lib/motion/shotcraft/upstream/references/shots/effects/slam-entrance-moves.md +55 -55
  243. package/lib/motion/shotcraft/upstream/references/shots/effects/spotlight-sweep-moves.md +52 -52
  244. package/lib/motion/shotcraft/upstream/references/shots/interaction/autolayout-gap-dial.md +60 -60
  245. package/lib/motion/shotcraft/upstream/references/shots/interaction/canvas-materialize-moves.md +57 -57
  246. package/lib/motion/shotcraft/upstream/references/shots/interaction/chip-grid-single-select-blackout.md +51 -51
  247. package/lib/motion/shotcraft/upstream/references/shots/interaction/collab-cursor-moves.md +41 -41
  248. package/lib/motion/shotcraft/upstream/references/shots/interaction/glass-pill-dictation-typing.md +53 -53
  249. package/lib/motion/shotcraft/upstream/references/shots/interaction/hashtag-to-pill-materialize.md +60 -60
  250. package/lib/motion/shotcraft/upstream/references/shots/interaction/picker-carousel-feature-cycle.md +55 -55
  251. package/lib/motion/shotcraft/upstream/references/shots/interaction/segmented-thumb-hero.md +57 -57
  252. package/lib/motion/shotcraft/upstream/references/shots/interaction/theme-switch-moves.md +47 -47
  253. package/lib/motion/shotcraft/upstream/references/shots/interaction/type-and-filter.md +37 -37
  254. package/lib/motion/shotcraft/upstream/references/shots/interaction/voice-waveform-live.md +54 -54
  255. package/lib/motion/shotcraft/upstream/references/shots/opening/brand-ink-open.md +36 -36
  256. package/lib/motion/shotcraft/upstream/references/shots/opening/crane-rise-reveal.md +56 -56
  257. package/lib/motion/shotcraft/upstream/references/shots/opening/dataviz-landscape-open.md +56 -56
  258. package/lib/motion/shotcraft/upstream/references/shots/opening/fracture.md +40 -40
  259. package/lib/motion/shotcraft/upstream/references/shots/opening/icon-field-colorize.md +60 -60
  260. package/lib/motion/shotcraft/upstream/references/shots/opening/letterspace-materialize.md +57 -57
  261. package/lib/motion/shotcraft/upstream/references/shots/opening/magician-card-flourish.md +73 -73
  262. package/lib/motion/shotcraft/upstream/references/shots/opening/orbit-ring-title-open.md +87 -87
  263. package/lib/motion/shotcraft/upstream/references/shots/opening/spotlight-hero-card.md +55 -55
  264. package/lib/motion/shotcraft/upstream/references/shots/opening/stroke-segment-build.md +50 -50
  265. package/lib/motion/shotcraft/upstream/references/shots/opening/text-as-mask.md +59 -59
  266. package/lib/motion/shotcraft/upstream/references/shots/outro/grain-dissolve.md +38 -38
  267. package/lib/motion/shotcraft/upstream/references/shots/outro/logo-shrink-wordmark-lockup.md +38 -38
  268. package/lib/motion/shotcraft/upstream/references/shots/outro/neon-triple-marquee.md +59 -59
  269. package/lib/motion/shotcraft/upstream/references/shots/outro/outro-group-photo-launch.md +39 -39
  270. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-strip-away-outro.md +61 -61
  271. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-to-brand-morph.md +52 -52
  272. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-cut-moves.md +50 -50
  273. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-step-list-theme-cycle.md +66 -66
  274. package/lib/motion/shotcraft/upstream/references/shots/rhythm/panel-grid-moves.md +43 -43
  275. package/lib/motion/shotcraft/upstream/references/shots/rhythm/quad-split-parallel-scenes.md +38 -38
  276. package/lib/motion/shotcraft/upstream/references/shots/rhythm/rhythm-interrupt-moves.md +38 -38
  277. package/lib/motion/shotcraft/upstream/references/shots/rhythm/sakuga-timing-shift.md +56 -56
  278. package/lib/motion/shotcraft/upstream/references/shots/rhythm/speed-ramp-freeze.md +44 -44
  279. package/lib/motion/shotcraft/upstream/references/shots/rhythm/trailer-grammar-moves.md +38 -38
  280. package/lib/motion/shotcraft/upstream/references/shots/transition/bottom-push-stack-wipe.md +63 -63
  281. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flip-reveal.md +57 -57
  282. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flock-tumble.md +63 -63
  283. package/lib/motion/shotcraft/upstream/references/shots/transition/circle-match-iris.md +58 -58
  284. package/lib/motion/shotcraft/upstream/references/shots/transition/gradient-transition.md +45 -45
  285. package/lib/motion/shotcraft/upstream/references/shots/transition/line-carry-transition.md +55 -55
  286. package/lib/motion/shotcraft/upstream/references/shots/transition/mosaic-reframe.md +49 -49
  287. package/lib/motion/shotcraft/upstream/references/shots/transition/page-turn-transitions.md +42 -42
  288. package/lib/motion/shotcraft/upstream/references/shots/transition/print-texture-transitions.md +42 -42
  289. package/lib/motion/shotcraft/upstream/references/shots/transition/shot-transitions.md +45 -45
  290. package/lib/motion/shotcraft/upstream/references/shots/transition/tear-streak-transitions.md +48 -48
  291. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-hidden-cut.md +55 -55
  292. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-travel.md +43 -43
  293. package/lib/motion/shotcraft/upstream/references/shots/transition/white-flash-logo-simplify-cut.md +41 -41
  294. package/lib/motion/shotcraft/upstream/references/shots/transition/wipe-transitions.md +42 -42
  295. package/lib/motion/shotcraft/upstream/references/shots/typography/blur-slide.md +59 -59
  296. package/lib/motion/shotcraft/upstream/references/shots/typography/brace-expand.md +55 -55
  297. package/lib/motion/shotcraft/upstream/references/shots/typography/countdown-arc-scatter.md +65 -65
  298. package/lib/motion/shotcraft/upstream/references/shots/typography/document-typewriter-reveal.md +42 -42
  299. package/lib/motion/shotcraft/upstream/references/shots/typography/flying-words.md +64 -64
  300. package/lib/motion/shotcraft/upstream/references/shots/typography/glitch-cycle.md +64 -64
  301. package/lib/motion/shotcraft/upstream/references/shots/typography/gradient-word-sweep.md +54 -54
  302. package/lib/motion/shotcraft/upstream/references/shots/typography/lead-word-zoom-assemble.md +91 -91
  303. package/lib/motion/shotcraft/upstream/references/shots/typography/marker-underline-title.md +51 -51
  304. package/lib/motion/shotcraft/upstream/references/shots/typography/outline-word-fill.md +66 -66
  305. package/lib/motion/shotcraft/upstream/references/shots/typography/paper-title-card.md +38 -38
  306. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-chip-slot-cycle-handled.md +66 -66
  307. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-slot-cycle.md +58 -58
  308. package/lib/motion/shotcraft/upstream/references/shots/typography/text-column-converge.md +61 -61
  309. package/lib/motion/shotcraft/upstream/references/shots/typography/title-demote-to-label.md +64 -64
  310. package/lib/motion/shotcraft/upstream/references/shots/typography/type-assembly-moves.md +45 -45
  311. package/lib/motion/shotcraft/upstream/references/shots/typography/type-entrance-moves.md +41 -41
  312. package/lib/motion/shotcraft/upstream/references/shots/typography/type-rhythm-sync.md +51 -51
  313. package/lib/motion/shotcraft/upstream/references/shots/typography/typewriter-moves.md +42 -42
  314. package/lib/motion/shotcraft/upstream/references/shots/typography/vertical-word-roll-blur-cycle.md +63 -63
  315. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-filmstrip.md +57 -57
  316. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-geometry.md +75 -75
  317. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/avatar-bracket-carousel.md +59 -59
  318. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/bezier-source-converge-merge.md +67 -67
  319. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/card-stack.md +60 -60
  320. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/carousel-3d.md +66 -66
  321. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/cloner-depth-echo.md +40 -40
  322. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/deck-deal-flyin.md +45 -45
  323. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/doc-park-left-pill-deal.md +62 -62
  324. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/draw-svg-trace.md +55 -55
  325. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/element-body-moves.md +37 -37
  326. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/integration-hub-map.md +55 -55
  327. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-reveal.md +50 -50
  328. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-stack-press.md +43 -43
  329. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-forerun.md +55 -55
  330. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-orbit-drop.md +51 -51
  331. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/page-waterfall-wall.md +51 -51
  332. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/product-card-progressive-assemble.md +56 -56
  333. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/radial-wave.md +49 -49
  334. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/research-card-stack-scroll.md +57 -57
  335. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/row-embed.md +36 -36
  336. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/value-stagger-gradient.md +64 -64
  337. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/wall-reveal-moves.md +47 -47
  338. package/lib/motion/shotcraft/upstream/references/sound-design.md +170 -170
  339. package/lib/motion/shotcraft/upstream/references/workbench.md +157 -157
  340. package/lib/motion/shotcraft/upstream/template/TEMPLATE.md +103 -103
  341. package/lib/motion/shotcraft/upstream/template/THEMES.md +44 -44
  342. package/lib/motion/shotcraft/upstream/template/package.json +20 -20
  343. package/lib/motion/shotcraft/upstream/template/remotion.config.ts +6 -6
  344. package/lib/motion/shotcraft/upstream/template/src/Root.tsx +17 -17
  345. package/lib/motion/shotcraft/upstream/template/src/aifl/Caption.tsx +65 -65
  346. package/lib/motion/shotcraft/upstream/template/src/aifl/DigitRoll.tsx +48 -48
  347. package/lib/motion/shotcraft/upstream/template/src/aifl/FlashCut.tsx +24 -24
  348. package/lib/motion/shotcraft/upstream/template/src/aifl/Main.tsx +192 -192
  349. package/lib/motion/shotcraft/upstream/template/src/aifl/PaperTitleCard.tsx +111 -111
  350. package/lib/motion/shotcraft/upstream/template/src/aifl/live/PageCam.tsx +150 -150
  351. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneDetail.tsx +158 -158
  352. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneFlyIn.tsx +468 -468
  353. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOpen.tsx +552 -552
  354. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOutroLive.tsx +411 -411
  355. package/lib/motion/shotcraft/upstream/template/src/aifl/live/ScenePapers.tsx +200 -200
  356. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneWbr.tsx +324 -324
  357. package/lib/motion/shotcraft/upstream/template/src/aifl/live-layout.json +388 -388
  358. package/lib/motion/shotcraft/upstream/template/src/index.ts +4 -4
  359. package/lib/motion/shotcraft/upstream/template/src/themes/ThemedFilm.tsx +7 -7
  360. package/lib/motion/shotcraft/upstream/template/src/themes/manifest.tsx +68 -68
  361. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.json +1 -1
  362. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.ts +24 -24
  363. package/lib/motion/shotcraft/upstream/template/src/themes/palettes.json +74 -74
  364. package/lib/motion/shotcraft/upstream/template/src/themes/visual-theme.tsx +91 -91
  365. package/lib/motion/shotcraft/upstream/template/src/workbench.ts +213 -213
  366. package/lib/motion/shotcraft/upstream/template/tsconfig.json +15 -15
  367. package/lib/motion/style-frames.js +306 -306
  368. package/lib/motion/sync.js +214 -214
  369. package/lib/motion-library.js +1 -1
  370. package/lib/motion-project.js +105 -105
  371. package/lib/motion-render-worker.js +174 -174
  372. package/lib/routing/router.js +222 -222
  373. package/lib/routing/vendor/README.md +96 -96
  374. package/lib/routing/vendor/libavoid-routing.js +753 -753
  375. package/lib/routing/vendor/libavoid.min.js +59 -59
  376. package/lib/svg-export.js +1344 -0
  377. package/lib/video-trace-pool.js +128 -128
  378. package/package.json +3 -2
  379. package/LICENSE +0 -4175
@@ -1,262 +1,262 @@
1
- // light-leak-burn〔转场〕:一团暖色胶片漏光从右上角斜扫入画,亮度顶峰时吞掉旧画面七成以上(高光溢出、
2
- // 对比度被冲淡),光峰帧硬切新画面,光沿对角线退散时新画面已在光下就位——比白闪柔、有方向、有温度。
3
- //
4
- // 第二轮重设计(暖黑电影感 · video-shotcraft 取景器的模式切换:"从夜到黄昏"):
5
- // - look = ember(暖黑 · 余烬橙 · 琥珀金)。A / B 是同一个取景器里的两张全出血"照片"——同一道山脊剪影:
6
- // A 夜景(冷蓝黑天、星点、新月、山间一盏暖窗灯)配品牌短句上半「Frame motion.」;
7
- // B 黄昏(赤橙天空、半落的太阳、暖色雾带)配下半「Craft the shot.」。漏光本身就是"天亮了"——光效即语义,
8
- // 一句 motto 被光峰切成两半。
9
- // - 取景器 UI 让它是产品而不是壁纸:四角取景框、顶部镜刻标志 + 字标与等宽曝光参数、底部模式拨轮(NIGHT / GOLDEN HOUR / PORTRAIT),
10
- // 光峰后高亮滑块从 NIGHT 滑到 GOLDEN HOUR(swift 曲线 14f)。
11
- // - 漏光三段色温:白热核 #fff3dc → 琥珀 #ffb347 → 余烬橙 #ff5a1f → 外缘赭红;全部是沿扫掠对角线拉长、转 −34° 的
12
- // 径向渐变椭圆(screen 叠加,不用 blur 滤镜——渐变本身就软,且便宜);右缘另有一道"片门溢光"线性光带
13
- // 随光强长出(真漏光是从画框边缘漏进来的)。峰值时页面 brightness ↑ / contrast ↓ / saturate ↓ = 被烧穿。
14
- // - 光强包络:爬升 ease-in 27f(蓄力)→ 52f 峰值藏切 → ease-out 43f 收敛(余温);热核 = intensity³,只在峰值附近烧起来。
15
- //
16
- // 时间表(30fps,共 130f):
17
- // 0–24 A 夜景:标题逐词从线下升起(4–24),星点闪烁,镜头极缓推进 1 → 1.02
18
- // 24–52 漏光从右上角爬入,强度 ease-in 爬升,夜景被逐渐冲淡
19
- // 52 光峰帧:画面七成以上烧白,硬切 A → B
20
- // 52–95 光沿对角线退向左下并衰减;B 镜头 1.04 → 1 落定(out);54–68 模式滑块滑到 GOLDEN HOUR;
21
- // 62–86 B 标题逐词升起(在余温里)
22
- // 95–130 hold 35f:太阳泛光极缓呼吸、取景器曝光数字静止
23
- import React from 'react';
24
- import { AbsoluteFill, useCurrentFrame } from 'remotion';
25
- import { EASE, FONT, Grain, Vignette, mix, ramp } from '../../_fixtures/Polish';
26
- import { LOOKS, TextReveal, alpha, type } from '../../_fixtures/Look';
27
- import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
28
-
29
- export const LIGHT_LEAK_BURN_DURATION = 130;
30
-
31
- const L = LOOKS.ember;
32
- const W = 1920;
33
- const H = 1080;
34
- const PAD = 120;
35
- const LEAK_IN = 24;
36
- const PEAK = 52; // 光峰帧 = 藏切点
37
- const LEAK_OUT = 95;
38
-
39
- const h = (n: number) => {
40
- const s = Math.sin(n * 127.3) * 43758.5453;
41
- return s - Math.floor(s);
42
- };
43
-
44
- // 同一道山脊(两张照片共用,换景时构图不跳)
45
- const RIDGE_FAR = 'M0 640 C 180 600 300 560 420 580 C 560 604 640 520 780 500 C 900 484 1000 560 1120 570 C 1260 582 1380 500 1520 490 C 1680 480 1800 560 1920 548 L1920 1080 L0 1080 Z';
46
- const RIDGE_MID = 'M0 760 C 160 700 300 690 440 720 C 600 756 720 650 880 640 C 1040 630 1140 720 1300 730 C 1460 740 1600 660 1760 670 C 1840 676 1890 700 1920 706 L1920 1080 L0 1080 Z';
47
- const RIDGE_NEAR = 'M0 880 C 220 820 420 830 600 860 C 800 892 980 800 1180 812 C 1380 824 1560 900 1760 880 C 1840 872 1890 864 1920 862 L1920 1080 L0 1080 Z';
48
-
49
- const STARS = Array.from({ length: 70 }, (_, i) => ({
50
- x: h(i * 3.1 + 1) * W, y: h(i * 5.7 + 2) * 520, r: 0.8 + h(i * 7.3) * 1.8, p: h(i * 11.1) * 6.28,
51
- }));
52
-
53
- const Night: React.FC<{ f: number }> = ({ f }) => (
54
- <svg width={W} height={H} viewBox={`0 0 ${W} ${H}`} style={{ position: 'absolute', inset: 0 }}>
55
- <defs>
56
- <linearGradient id="nsky" x1="0" y1="0" x2="0" y2="1">
57
- <stop offset="0" stopColor="#080a12" />
58
- <stop offset="0.45" stopColor="#111523" />
59
- <stop offset="0.62" stopColor="#1f1d2a" />
60
- </linearGradient>
61
- <radialGradient id="nmoon" cx="0.5" cy="0.5" r="0.5">
62
- <stop offset="0" stopColor="#e9e2d2" stopOpacity={0.35} />
63
- <stop offset="1" stopColor="#e9e2d2" stopOpacity={0} />
64
- </radialGradient>
65
- <mask id="ncres">
66
- <rect width={W} height={H} fill="#000" />
67
- <circle cx={1450} cy={250} r={46} fill="#fff" />
68
- <circle cx={1470} cy={238} r={42} fill="#000" />
69
- </mask>
70
- </defs>
71
- <rect width={W} height={H} fill="url(#nsky)" />
72
- {STARS.map((s, i) => (
73
- <circle key={i} cx={s.x} cy={s.y} r={s.r} fill="#f2ecff" opacity={0.25 + 0.55 * (0.5 + 0.5 * Math.sin(f / 7 + s.p))} />
74
- ))}
75
- <circle cx={1450} cy={250} r={170} fill="url(#nmoon)" />
76
- <rect width={W} height={H} fill="#efe8d8" mask="url(#ncres)" />
77
- <path d={RIDGE_FAR} fill="#1a1c28" />
78
- <path d={RIDGE_MID} fill="#11121b" />
79
- <path d={RIDGE_NEAR} fill="#07070b" />
80
- {/* 山间一盏暖窗灯:夜景里唯一的暖色,预告漏光 */}
81
- <circle cx={1606} cy={898} r={28} fill={alpha(L.accent2, 0.2)} />
82
- <rect x={1600} y={890} width={12} height={10} rx={2} fill={L.accent2} />
83
- </svg>
84
- );
85
-
86
- const Golden: React.FC<{ f: number }> = ({ f }) => {
87
- const b = 1 + 0.03 * Math.sin(f / 18);
88
- return (
89
- <svg width={W} height={H} viewBox={`0 0 ${W} ${H}`} style={{ position: 'absolute', inset: 0 }}>
90
- <defs>
91
- <linearGradient id="gsky" x1="0" y1="0" x2="0" y2="1">
92
- <stop offset="0" stopColor="#2a110b" />
93
- <stop offset="0.3" stopColor="#8a3218" />
94
- <stop offset="0.5" stopColor="#e0702e" />
95
- <stop offset="0.62" stopColor="#ffb661" />
96
- </linearGradient>
97
- <radialGradient id="gsun" cx="0.5" cy="0.5" r="0.5">
98
- <stop offset="0" stopColor="#fff4d8" stopOpacity={0.95} />
99
- <stop offset="0.25" stopColor="#ffd590" stopOpacity={0.55} />
100
- <stop offset="1" stopColor="#ff9a4a" stopOpacity={0} />
101
- </radialGradient>
102
- <linearGradient id="ghaze" x1="0" y1="0" x2="0" y2="1">
103
- <stop offset="0" stopColor="#ffb661" stopOpacity={0} />
104
- <stop offset="0.5" stopColor="#ffb661" stopOpacity={0.35} />
105
- <stop offset="1" stopColor="#ffb661" stopOpacity={0} />
106
- </linearGradient>
107
- </defs>
108
- <rect width={W} height={H} fill="url(#gsky)" />
109
- <circle cx={1300} cy={600} r={420 * b} fill="url(#gsun)" />
110
- <circle cx={1300} cy={600} r={96} fill="#fff6e2" />
111
- <path d={RIDGE_FAR} fill="#b04a24" />
112
- <rect x={0} y={520} width={W} height={160} fill="url(#ghaze)" />
113
- <path d={RIDGE_MID} fill="#6a2412" />
114
- <path d={RIDGE_NEAR} fill="#2a0d06" />
115
- </svg>
116
- );
117
- };
118
-
119
- // 品牌短句(PITCH.en.motto)被光峰切成两半:A 夜景 / B 黄昏
120
- const MOTTO_A = 'Frame motion.';
121
- const MOTTO_B = 'Craft the shot.';
122
-
123
- const MODES = ['NIGHT', 'GOLDEN HOUR', 'PORTRAIT'];
124
- const MODE_X = [0, 220, 532]; // 每项左缘(相对拨轮)
125
- const MODE_W = [172, 272, 228];
126
-
127
- // 取景器 UI(两页共用,只有数值与模式不同)
128
- const Viewfinder: React.FC<{ golden: boolean; slide: number }> = ({ golden, slide }) => {
129
- const corner = (x: number, y: number, sx: number, sy: number) => (
130
- <div style={{
131
- position: 'absolute', left: x, top: y, width: 56, height: 56,
132
- borderTop: sy > 0 ? `3px solid ${alpha(L.ink, 0.8)}` : undefined, borderBottom: sy < 0 ? `3px solid ${alpha(L.ink, 0.8)}` : undefined,
133
- borderLeft: sx > 0 ? `3px solid ${alpha(L.ink, 0.8)}` : undefined, borderRight: sx < 0 ? `3px solid ${alpha(L.ink, 0.8)}` : undefined,
134
- }} />
135
- );
136
- const hx = mix(MODE_X[0], MODE_X[1], slide);
137
- const hw = mix(MODE_W[0], MODE_W[1], slide);
138
- return (
139
- <>
140
- {corner(72, 72, 1, 1)}
141
- {corner(W - 128, 72, -1, 1)}
142
- {corner(72, H - 128, 1, -1)}
143
- {corner(W - 128, H - 128, -1, -1)}
144
- <div style={{
145
- position: 'absolute', left: PAD + 36, right: PAD + 36, top: 96, display: 'flex', justifyContent: 'space-between',
146
- fontFamily: FONT.mono, fontSize: 28, fontWeight: 600, letterSpacing: '0.08em', color: alpha(L.ink, 0.82),
147
- }}>
148
- <span style={{ display: 'flex', alignItems: 'center', gap: 14 }}>
149
- <span style={{ color: L.accent }}>●</span>
150
- <ShotcraftMark size={36} tone="dark" />
151
- <span style={{ letterSpacing: '0.02em' }}>{BRAND.name}</span>
152
- </span>
153
- <span>{golden ? 'ISO 100 · 1/500 · ƒ2.8' : 'ISO 3200 · 1/8 · ƒ1.6'}</span>
154
- <span>{golden ? '4K · 24' : 'RAW · 24'}</span>
155
- </div>
156
- {/* 模式拨轮 */}
157
- <div style={{ position: 'absolute', left: (W - 760) / 2, top: H - 156, width: 760, height: 64 }}>
158
- <div style={{
159
- position: 'absolute', left: hx, top: 0, width: hw, height: 64, borderRadius: 32,
160
- background: alpha('#140805', 0.55), border: `1.5px solid ${alpha(L.accent2, 0.55)}`,
161
- boxShadow: `0 0 24px ${alpha(L.accent2, 0.25)}`,
162
- }} />
163
- {MODES.map((m, i) => {
164
- const on = i === 0 ? 1 - slide : i === 1 ? slide : 0;
165
- return (
166
- <div key={m} style={{
167
- position: 'absolute', left: MODE_X[i], width: MODE_W[i], top: 0, height: 64, display: 'flex', alignItems: 'center', justifyContent: 'center',
168
- fontFamily: FONT.sans, fontSize: 28, fontWeight: 700, letterSpacing: '0.14em',
169
- color: on > 0.5 ? L.accent2 : alpha(L.ink, 0.62),
170
- }}>{m}</div>
171
- );
172
- })}
173
- </div>
174
- </>
175
- );
176
- };
177
-
178
- export const LightLeakBurn: React.FC = () => {
179
- const frame = useCurrentFrame();
180
- const golden = frame > PEAK;
181
-
182
- // 光强包络:ease-in 爬升 → 峰值 → ease-out 收敛
183
- const intensity = frame <= PEAK
184
- ? ramp(frame, LEAK_IN, PEAK - LEAK_IN, (t) => t * t)
185
- : 1 - ramp(frame, PEAK, LEAK_OUT - PEAK, EASE.out);
186
- // 光团沿对角线:右上外 → 左下外(全程 swift,峰值时在画面中上偏右)
187
- const sweep = ramp(frame, LEAK_IN, LEAK_OUT - LEAK_IN, (t) => 1 - Math.pow(1 - t, 1.2));
188
- const cx = mix(2250, -500, sweep);
189
- const cy = mix(-380, 1400, sweep);
190
-
191
- // 镜头:A 极缓推进,B 从 1.04 落定
192
- const zoom = golden ? 1 + 0.04 * (1 - ramp(frame, PEAK, 44, EASE.out)) : 1 + 0.02 * ramp(frame, 0, PEAK, EASE.smooth);
193
- const burn = `brightness(${(1 + intensity * 0.85).toFixed(3)}) contrast(${(1 - intensity * 0.5).toFixed(3)}) saturate(${(1 - intensity * 0.25).toFixed(3)})`;
194
- // 高光溢出把 A 的字也烧淡(峰值处只剩 ~25%),切点那一下不会看到标题突然换字
195
- const aWash = golden ? 1 : 1 - 0.75 * Math.pow(intensity, 1.6);
196
- const slide = ramp(frame, PEAK + 2, 14, EASE.swift);
197
-
198
- // 三段色温光团(长径 / 颜色 / 透明度 / 沿扫掠方向的偏移)
199
- const blobs = [
200
- { d: 3000, c: '#c2311a', a: 0.6, o: 360 },
201
- { d: 2300, c: '#ff5a1f', a: 0.8, o: 160 },
202
- { d: 1700, c: '#ffb347', a: 0.95, o: 0 },
203
- ];
204
- const core = Math.pow(intensity, 3);
205
- const cutFlash = frame === PEAK || frame === PEAK + 1 ? 0.25 : 0;
206
-
207
- return (
208
- <AbsoluteFill style={{ background: L.bg[2], overflow: 'hidden' }}>
209
- {/* 画面层(受漏光烧穿) */}
210
- <div style={{ position: 'absolute', inset: 0, filter: intensity > 0.01 ? burn : undefined }}>
211
- <div style={{ position: 'absolute', inset: 0, transform: `scale(${zoom.toFixed(5)})` }}>
212
- {golden ? <Golden f={frame} /> : <Night f={frame} />}
213
- </div>
214
- {/* 底部压暗,托住标题与拨轮 */}
215
- <div style={{ position: 'absolute', inset: 0, background: `linear-gradient(180deg, ${alpha('#000000', 0.25)} 0%, rgba(0,0,0,0) 22%, rgba(0,0,0,0) 52%, ${alpha('#0a0402', 0.72)} 100%)` }} />
216
- {/* 标题 */}
217
- <div style={{ position: 'absolute', left: PAD + 36, top: 596, opacity: aWash }}>
218
- <div style={{ ...type(28, 700, { caps: true }), letterSpacing: '0.2em', color: golden ? L.accent2 : alpha(L.ink, 0.7), marginBottom: 22 }}>
219
- {golden ? '02 — Golden hour' : '01 — Night'}
220
- </div>
221
- <div style={{ ...type(140, 760), color: L.ink }}>
222
- {golden ? (
223
- <TextReveal key="b" text={MOTTO_B} by="word" variant="rise" start={PEAK + 10} each={20} gap={4} />
224
- ) : (
225
- <TextReveal key="a" text={MOTTO_A} by="word" variant="rise" start={2} each={20} gap={4} />
226
- )}
227
- </div>
228
- </div>
229
- <Viewfinder golden={golden} slide={slide} />
230
- </div>
231
-
232
- {/* 漏光层 */}
233
- {intensity > 0.003 && (
234
- <div style={{ position: 'absolute', inset: 0, pointerEvents: 'none' }}>
235
- {/* 片门溢光:从右缘与上缘漏进来的线性光带 */}
236
- <div style={{
237
- position: 'absolute', inset: 0, mixBlendMode: 'screen', opacity: intensity,
238
- background: `linear-gradient(250deg, ${alpha('#ffb347', 0.9)} 0%, ${alpha('#ff5a1f', 0.55)} 14%, ${alpha('#c2311a', 0.2)} 30%, rgba(0,0,0,0) 46%)`,
239
- }} />
240
- {blobs.map((b, i) => (
241
- <div key={i} style={{
242
- position: 'absolute', left: cx - b.d / 2 + b.o * 0.8, top: cy - b.d / 2.7 - b.o * 0.6, width: b.d, height: b.d / 1.35,
243
- borderRadius: '50%', transform: 'rotate(-34deg)', mixBlendMode: 'screen', opacity: b.a * intensity,
244
- background: `radial-gradient(closest-side, ${alpha(b.c, 1)} 0%, ${alpha(b.c, 0.65)} 35%, ${alpha(b.c, 0)} 100%)`,
245
- }} />
246
- ))}
247
- {/* 白热核:只在峰值附近烧起来 */}
248
- <div style={{
249
- position: 'absolute', left: cx - 1100, top: cy - 700, width: 2200, height: 1400, borderRadius: '50%', transform: 'rotate(-34deg)',
250
- mixBlendMode: 'screen', opacity: core,
251
- background: 'radial-gradient(closest-side, #fff6e6 0%, rgba(255,236,200,0.9) 40%, rgba(255,200,130,0) 100%)',
252
- }} />
253
- {/* 全屏暖罩:高光溢出带温度 */}
254
- <div style={{ position: 'absolute', inset: 0, background: '#ff9a4a', mixBlendMode: 'screen', opacity: 0.4 * intensity * intensity + cutFlash }} />
255
- </div>
256
- )}
257
-
258
- <Vignette strength={0.5 * (1 - 0.6 * intensity)} color={L.shadow} inner={0.48} />
259
- <Grain opacity={0.08 + 0.08 * intensity} step={2} blend="soft-light" />
260
- </AbsoluteFill>
261
- );
262
- };
1
+ // light-leak-burn〔转场〕:一团暖色胶片漏光从右上角斜扫入画,亮度顶峰时吞掉旧画面七成以上(高光溢出、
2
+ // 对比度被冲淡),光峰帧硬切新画面,光沿对角线退散时新画面已在光下就位——比白闪柔、有方向、有温度。
3
+ //
4
+ // 第二轮重设计(暖黑电影感 · video-shotcraft 取景器的模式切换:"从夜到黄昏"):
5
+ // - look = ember(暖黑 · 余烬橙 · 琥珀金)。A / B 是同一个取景器里的两张全出血"照片"——同一道山脊剪影:
6
+ // A 夜景(冷蓝黑天、星点、新月、山间一盏暖窗灯)配品牌短句上半「Frame motion.」;
7
+ // B 黄昏(赤橙天空、半落的太阳、暖色雾带)配下半「Craft the shot.」。漏光本身就是"天亮了"——光效即语义,
8
+ // 一句 motto 被光峰切成两半。
9
+ // - 取景器 UI 让它是产品而不是壁纸:四角取景框、顶部镜刻标志 + 字标与等宽曝光参数、底部模式拨轮(NIGHT / GOLDEN HOUR / PORTRAIT),
10
+ // 光峰后高亮滑块从 NIGHT 滑到 GOLDEN HOUR(swift 曲线 14f)。
11
+ // - 漏光三段色温:白热核 #fff3dc → 琥珀 #ffb347 → 余烬橙 #ff5a1f → 外缘赭红;全部是沿扫掠对角线拉长、转 −34° 的
12
+ // 径向渐变椭圆(screen 叠加,不用 blur 滤镜——渐变本身就软,且便宜);右缘另有一道"片门溢光"线性光带
13
+ // 随光强长出(真漏光是从画框边缘漏进来的)。峰值时页面 brightness ↑ / contrast ↓ / saturate ↓ = 被烧穿。
14
+ // - 光强包络:爬升 ease-in 27f(蓄力)→ 52f 峰值藏切 → ease-out 43f 收敛(余温);热核 = intensity³,只在峰值附近烧起来。
15
+ //
16
+ // 时间表(30fps,共 130f):
17
+ // 0–24 A 夜景:标题逐词从线下升起(4–24),星点闪烁,镜头极缓推进 1 → 1.02
18
+ // 24–52 漏光从右上角爬入,强度 ease-in 爬升,夜景被逐渐冲淡
19
+ // 52 光峰帧:画面七成以上烧白,硬切 A → B
20
+ // 52–95 光沿对角线退向左下并衰减;B 镜头 1.04 → 1 落定(out);54–68 模式滑块滑到 GOLDEN HOUR;
21
+ // 62–86 B 标题逐词升起(在余温里)
22
+ // 95–130 hold 35f:太阳泛光极缓呼吸、取景器曝光数字静止
23
+ import React from 'react';
24
+ import { AbsoluteFill, useCurrentFrame } from 'remotion';
25
+ import { EASE, FONT, Grain, Vignette, mix, ramp } from '../../_fixtures/Polish';
26
+ import { LOOKS, TextReveal, alpha, type } from '../../_fixtures/Look';
27
+ import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
28
+
29
+ export const LIGHT_LEAK_BURN_DURATION = 130;
30
+
31
+ const L = LOOKS.ember;
32
+ const W = 1920;
33
+ const H = 1080;
34
+ const PAD = 120;
35
+ const LEAK_IN = 24;
36
+ const PEAK = 52; // 光峰帧 = 藏切点
37
+ const LEAK_OUT = 95;
38
+
39
+ const h = (n: number) => {
40
+ const s = Math.sin(n * 127.3) * 43758.5453;
41
+ return s - Math.floor(s);
42
+ };
43
+
44
+ // 同一道山脊(两张照片共用,换景时构图不跳)
45
+ const RIDGE_FAR = 'M0 640 C 180 600 300 560 420 580 C 560 604 640 520 780 500 C 900 484 1000 560 1120 570 C 1260 582 1380 500 1520 490 C 1680 480 1800 560 1920 548 L1920 1080 L0 1080 Z';
46
+ const RIDGE_MID = 'M0 760 C 160 700 300 690 440 720 C 600 756 720 650 880 640 C 1040 630 1140 720 1300 730 C 1460 740 1600 660 1760 670 C 1840 676 1890 700 1920 706 L1920 1080 L0 1080 Z';
47
+ const RIDGE_NEAR = 'M0 880 C 220 820 420 830 600 860 C 800 892 980 800 1180 812 C 1380 824 1560 900 1760 880 C 1840 872 1890 864 1920 862 L1920 1080 L0 1080 Z';
48
+
49
+ const STARS = Array.from({ length: 70 }, (_, i) => ({
50
+ x: h(i * 3.1 + 1) * W, y: h(i * 5.7 + 2) * 520, r: 0.8 + h(i * 7.3) * 1.8, p: h(i * 11.1) * 6.28,
51
+ }));
52
+
53
+ const Night: React.FC<{ f: number }> = ({ f }) => (
54
+ <svg width={W} height={H} viewBox={`0 0 ${W} ${H}`} style={{ position: 'absolute', inset: 0 }}>
55
+ <defs>
56
+ <linearGradient id="nsky" x1="0" y1="0" x2="0" y2="1">
57
+ <stop offset="0" stopColor="#080a12" />
58
+ <stop offset="0.45" stopColor="#111523" />
59
+ <stop offset="0.62" stopColor="#1f1d2a" />
60
+ </linearGradient>
61
+ <radialGradient id="nmoon" cx="0.5" cy="0.5" r="0.5">
62
+ <stop offset="0" stopColor="#e9e2d2" stopOpacity={0.35} />
63
+ <stop offset="1" stopColor="#e9e2d2" stopOpacity={0} />
64
+ </radialGradient>
65
+ <mask id="ncres">
66
+ <rect width={W} height={H} fill="#000" />
67
+ <circle cx={1450} cy={250} r={46} fill="#fff" />
68
+ <circle cx={1470} cy={238} r={42} fill="#000" />
69
+ </mask>
70
+ </defs>
71
+ <rect width={W} height={H} fill="url(#nsky)" />
72
+ {STARS.map((s, i) => (
73
+ <circle key={i} cx={s.x} cy={s.y} r={s.r} fill="#f2ecff" opacity={0.25 + 0.55 * (0.5 + 0.5 * Math.sin(f / 7 + s.p))} />
74
+ ))}
75
+ <circle cx={1450} cy={250} r={170} fill="url(#nmoon)" />
76
+ <rect width={W} height={H} fill="#efe8d8" mask="url(#ncres)" />
77
+ <path d={RIDGE_FAR} fill="#1a1c28" />
78
+ <path d={RIDGE_MID} fill="#11121b" />
79
+ <path d={RIDGE_NEAR} fill="#07070b" />
80
+ {/* 山间一盏暖窗灯:夜景里唯一的暖色,预告漏光 */}
81
+ <circle cx={1606} cy={898} r={28} fill={alpha(L.accent2, 0.2)} />
82
+ <rect x={1600} y={890} width={12} height={10} rx={2} fill={L.accent2} />
83
+ </svg>
84
+ );
85
+
86
+ const Golden: React.FC<{ f: number }> = ({ f }) => {
87
+ const b = 1 + 0.03 * Math.sin(f / 18);
88
+ return (
89
+ <svg width={W} height={H} viewBox={`0 0 ${W} ${H}`} style={{ position: 'absolute', inset: 0 }}>
90
+ <defs>
91
+ <linearGradient id="gsky" x1="0" y1="0" x2="0" y2="1">
92
+ <stop offset="0" stopColor="#2a110b" />
93
+ <stop offset="0.3" stopColor="#8a3218" />
94
+ <stop offset="0.5" stopColor="#e0702e" />
95
+ <stop offset="0.62" stopColor="#ffb661" />
96
+ </linearGradient>
97
+ <radialGradient id="gsun" cx="0.5" cy="0.5" r="0.5">
98
+ <stop offset="0" stopColor="#fff4d8" stopOpacity={0.95} />
99
+ <stop offset="0.25" stopColor="#ffd590" stopOpacity={0.55} />
100
+ <stop offset="1" stopColor="#ff9a4a" stopOpacity={0} />
101
+ </radialGradient>
102
+ <linearGradient id="ghaze" x1="0" y1="0" x2="0" y2="1">
103
+ <stop offset="0" stopColor="#ffb661" stopOpacity={0} />
104
+ <stop offset="0.5" stopColor="#ffb661" stopOpacity={0.35} />
105
+ <stop offset="1" stopColor="#ffb661" stopOpacity={0} />
106
+ </linearGradient>
107
+ </defs>
108
+ <rect width={W} height={H} fill="url(#gsky)" />
109
+ <circle cx={1300} cy={600} r={420 * b} fill="url(#gsun)" />
110
+ <circle cx={1300} cy={600} r={96} fill="#fff6e2" />
111
+ <path d={RIDGE_FAR} fill="#b04a24" />
112
+ <rect x={0} y={520} width={W} height={160} fill="url(#ghaze)" />
113
+ <path d={RIDGE_MID} fill="#6a2412" />
114
+ <path d={RIDGE_NEAR} fill="#2a0d06" />
115
+ </svg>
116
+ );
117
+ };
118
+
119
+ // 品牌短句(PITCH.en.motto)被光峰切成两半:A 夜景 / B 黄昏
120
+ const MOTTO_A = 'Frame motion.';
121
+ const MOTTO_B = 'Craft the shot.';
122
+
123
+ const MODES = ['NIGHT', 'GOLDEN HOUR', 'PORTRAIT'];
124
+ const MODE_X = [0, 220, 532]; // 每项左缘(相对拨轮)
125
+ const MODE_W = [172, 272, 228];
126
+
127
+ // 取景器 UI(两页共用,只有数值与模式不同)
128
+ const Viewfinder: React.FC<{ golden: boolean; slide: number }> = ({ golden, slide }) => {
129
+ const corner = (x: number, y: number, sx: number, sy: number) => (
130
+ <div style={{
131
+ position: 'absolute', left: x, top: y, width: 56, height: 56,
132
+ borderTop: sy > 0 ? `3px solid ${alpha(L.ink, 0.8)}` : undefined, borderBottom: sy < 0 ? `3px solid ${alpha(L.ink, 0.8)}` : undefined,
133
+ borderLeft: sx > 0 ? `3px solid ${alpha(L.ink, 0.8)}` : undefined, borderRight: sx < 0 ? `3px solid ${alpha(L.ink, 0.8)}` : undefined,
134
+ }} />
135
+ );
136
+ const hx = mix(MODE_X[0], MODE_X[1], slide);
137
+ const hw = mix(MODE_W[0], MODE_W[1], slide);
138
+ return (
139
+ <>
140
+ {corner(72, 72, 1, 1)}
141
+ {corner(W - 128, 72, -1, 1)}
142
+ {corner(72, H - 128, 1, -1)}
143
+ {corner(W - 128, H - 128, -1, -1)}
144
+ <div style={{
145
+ position: 'absolute', left: PAD + 36, right: PAD + 36, top: 96, display: 'flex', justifyContent: 'space-between',
146
+ fontFamily: FONT.mono, fontSize: 28, fontWeight: 600, letterSpacing: '0.08em', color: alpha(L.ink, 0.82),
147
+ }}>
148
+ <span style={{ display: 'flex', alignItems: 'center', gap: 14 }}>
149
+ <span style={{ color: L.accent }}>●</span>
150
+ <ShotcraftMark size={36} tone="dark" />
151
+ <span style={{ letterSpacing: '0.02em' }}>{BRAND.name}</span>
152
+ </span>
153
+ <span>{golden ? 'ISO 100 · 1/500 · ƒ2.8' : 'ISO 3200 · 1/8 · ƒ1.6'}</span>
154
+ <span>{golden ? '4K · 24' : 'RAW · 24'}</span>
155
+ </div>
156
+ {/* 模式拨轮 */}
157
+ <div style={{ position: 'absolute', left: (W - 760) / 2, top: H - 156, width: 760, height: 64 }}>
158
+ <div style={{
159
+ position: 'absolute', left: hx, top: 0, width: hw, height: 64, borderRadius: 32,
160
+ background: alpha('#140805', 0.55), border: `1.5px solid ${alpha(L.accent2, 0.55)}`,
161
+ boxShadow: `0 0 24px ${alpha(L.accent2, 0.25)}`,
162
+ }} />
163
+ {MODES.map((m, i) => {
164
+ const on = i === 0 ? 1 - slide : i === 1 ? slide : 0;
165
+ return (
166
+ <div key={m} style={{
167
+ position: 'absolute', left: MODE_X[i], width: MODE_W[i], top: 0, height: 64, display: 'flex', alignItems: 'center', justifyContent: 'center',
168
+ fontFamily: FONT.sans, fontSize: 28, fontWeight: 700, letterSpacing: '0.14em',
169
+ color: on > 0.5 ? L.accent2 : alpha(L.ink, 0.62),
170
+ }}>{m}</div>
171
+ );
172
+ })}
173
+ </div>
174
+ </>
175
+ );
176
+ };
177
+
178
+ export const LightLeakBurn: React.FC = () => {
179
+ const frame = useCurrentFrame();
180
+ const golden = frame > PEAK;
181
+
182
+ // 光强包络:ease-in 爬升 → 峰值 → ease-out 收敛
183
+ const intensity = frame <= PEAK
184
+ ? ramp(frame, LEAK_IN, PEAK - LEAK_IN, (t) => t * t)
185
+ : 1 - ramp(frame, PEAK, LEAK_OUT - PEAK, EASE.out);
186
+ // 光团沿对角线:右上外 → 左下外(全程 swift,峰值时在画面中上偏右)
187
+ const sweep = ramp(frame, LEAK_IN, LEAK_OUT - LEAK_IN, (t) => 1 - Math.pow(1 - t, 1.2));
188
+ const cx = mix(2250, -500, sweep);
189
+ const cy = mix(-380, 1400, sweep);
190
+
191
+ // 镜头:A 极缓推进,B 从 1.04 落定
192
+ const zoom = golden ? 1 + 0.04 * (1 - ramp(frame, PEAK, 44, EASE.out)) : 1 + 0.02 * ramp(frame, 0, PEAK, EASE.smooth);
193
+ const burn = `brightness(${(1 + intensity * 0.85).toFixed(3)}) contrast(${(1 - intensity * 0.5).toFixed(3)}) saturate(${(1 - intensity * 0.25).toFixed(3)})`;
194
+ // 高光溢出把 A 的字也烧淡(峰值处只剩 ~25%),切点那一下不会看到标题突然换字
195
+ const aWash = golden ? 1 : 1 - 0.75 * Math.pow(intensity, 1.6);
196
+ const slide = ramp(frame, PEAK + 2, 14, EASE.swift);
197
+
198
+ // 三段色温光团(长径 / 颜色 / 透明度 / 沿扫掠方向的偏移)
199
+ const blobs = [
200
+ { d: 3000, c: '#c2311a', a: 0.6, o: 360 },
201
+ { d: 2300, c: '#ff5a1f', a: 0.8, o: 160 },
202
+ { d: 1700, c: '#ffb347', a: 0.95, o: 0 },
203
+ ];
204
+ const core = Math.pow(intensity, 3);
205
+ const cutFlash = frame === PEAK || frame === PEAK + 1 ? 0.25 : 0;
206
+
207
+ return (
208
+ <AbsoluteFill style={{ background: L.bg[2], overflow: 'hidden' }}>
209
+ {/* 画面层(受漏光烧穿) */}
210
+ <div style={{ position: 'absolute', inset: 0, filter: intensity > 0.01 ? burn : undefined }}>
211
+ <div style={{ position: 'absolute', inset: 0, transform: `scale(${zoom.toFixed(5)})` }}>
212
+ {golden ? <Golden f={frame} /> : <Night f={frame} />}
213
+ </div>
214
+ {/* 底部压暗,托住标题与拨轮 */}
215
+ <div style={{ position: 'absolute', inset: 0, background: `linear-gradient(180deg, ${alpha('#000000', 0.25)} 0%, rgba(0,0,0,0) 22%, rgba(0,0,0,0) 52%, ${alpha('#0a0402', 0.72)} 100%)` }} />
216
+ {/* 标题 */}
217
+ <div style={{ position: 'absolute', left: PAD + 36, top: 596, opacity: aWash }}>
218
+ <div style={{ ...type(28, 700, { caps: true }), letterSpacing: '0.2em', color: golden ? L.accent2 : alpha(L.ink, 0.7), marginBottom: 22 }}>
219
+ {golden ? '02 — Golden hour' : '01 — Night'}
220
+ </div>
221
+ <div style={{ ...type(140, 760), color: L.ink }}>
222
+ {golden ? (
223
+ <TextReveal key="b" text={MOTTO_B} by="word" variant="rise" start={PEAK + 10} each={20} gap={4} />
224
+ ) : (
225
+ <TextReveal key="a" text={MOTTO_A} by="word" variant="rise" start={2} each={20} gap={4} />
226
+ )}
227
+ </div>
228
+ </div>
229
+ <Viewfinder golden={golden} slide={slide} />
230
+ </div>
231
+
232
+ {/* 漏光层 */}
233
+ {intensity > 0.003 && (
234
+ <div style={{ position: 'absolute', inset: 0, pointerEvents: 'none' }}>
235
+ {/* 片门溢光:从右缘与上缘漏进来的线性光带 */}
236
+ <div style={{
237
+ position: 'absolute', inset: 0, mixBlendMode: 'screen', opacity: intensity,
238
+ background: `linear-gradient(250deg, ${alpha('#ffb347', 0.9)} 0%, ${alpha('#ff5a1f', 0.55)} 14%, ${alpha('#c2311a', 0.2)} 30%, rgba(0,0,0,0) 46%)`,
239
+ }} />
240
+ {blobs.map((b, i) => (
241
+ <div key={i} style={{
242
+ position: 'absolute', left: cx - b.d / 2 + b.o * 0.8, top: cy - b.d / 2.7 - b.o * 0.6, width: b.d, height: b.d / 1.35,
243
+ borderRadius: '50%', transform: 'rotate(-34deg)', mixBlendMode: 'screen', opacity: b.a * intensity,
244
+ background: `radial-gradient(closest-side, ${alpha(b.c, 1)} 0%, ${alpha(b.c, 0.65)} 35%, ${alpha(b.c, 0)} 100%)`,
245
+ }} />
246
+ ))}
247
+ {/* 白热核:只在峰值附近烧起来 */}
248
+ <div style={{
249
+ position: 'absolute', left: cx - 1100, top: cy - 700, width: 2200, height: 1400, borderRadius: '50%', transform: 'rotate(-34deg)',
250
+ mixBlendMode: 'screen', opacity: core,
251
+ background: 'radial-gradient(closest-side, #fff6e6 0%, rgba(255,236,200,0.9) 40%, rgba(255,200,130,0) 100%)',
252
+ }} />
253
+ {/* 全屏暖罩:高光溢出带温度 */}
254
+ <div style={{ position: 'absolute', inset: 0, background: '#ff9a4a', mixBlendMode: 'screen', opacity: 0.4 * intensity * intensity + cutFlash }} />
255
+ </div>
256
+ )}
257
+
258
+ <Vignette strength={0.5 * (1 - 0.6 * intensity)} color={L.shadow} inner={0.48} />
259
+ <Grain opacity={0.08 + 0.08 * intensity} step={2} blend="soft-light" />
260
+ </AbsoluteFill>
261
+ );
262
+ };