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,303 +1,303 @@
1
- // axis-rescale-shock-v2 —— 轴爆表重标:折线正常爬升,新值顶破图表上沿冲进标题区,
2
- // 停半拍,y 轴"哗"地重标(旧刻度飞出 / 新刻度滑入 / 网格加密 / 旧线压扁成地平线),新值落回 + 弹真值标签。
3
- //
4
- // 第二轮重设计(沙色瑞士海报 · 渲染月报):
5
- // - look = sand(米色纸 + 墨黑 + 赤陶)。不再是"卡片里的小图表",而是整张画面就是一页瑞士网格财务海报:
6
- // 左上 120px 粗黑体标题「Monthly renders」、右上同字号年度合计 KPI,下面是满版图表(1540×540 绘图区),
7
- // 3px 墨黑基线 + 3px "天花板"粗规线 + 发丝网格,历史面积用 45° 斜线排线(印刷感),月份/刻度 32px。
8
- // - 主角是赤陶色爆表段:Dec 新值从 Nov 起跳,越冲越快顶破天花板规线(规线在穿透点裂开、两片碎屑弹飞),
9
- // 一路冲进右上角的 KPI 数字里(KPI 被撞得一颤),悬停半拍带柔光——"装不下"字面化。
10
- // - 重标:14f 内旧刻度 25k–100k 向下飞出、新刻度 100k–400k 从上滑入,网格 4→8 根从左展开,
11
- // 旧折线与斜线面积被压扁成地平线;爆表点落回 340k,弹出赤陶真值标签,KPI 滚到 833k。
12
- // - 品牌轮:眉题换成 video-shotcraft 标志 + 字标,内容从财务营收换成渲染量(数值与版式不变)。
13
- //
14
- // 时间表(30fps,共 168f):
15
- // 0–20 规线从左画出、标题逐词升起、刻度/月份淡入(第 1 帧已有纸面与规线起点)
16
- // 14–56 历史段 Jan→Nov 写入(42f,不对称 in-out),笔尖带墨点
17
- // 50–62 预警:天花板规线与 100k 刻度转赤陶,Nov 点一圈脉冲(预备)
18
- // 62–76 爆表 14f:越冲越快(ease-in 主导)顶破规线(~69f 穿透:裂口 + 碎屑 + 图表震 10px)→ 冲进 KPI
19
- // 76–94 悬停 18f:笔尖亮头 + 柔光,KPI 被撞后阻尼回位
20
- // 94–108 重标 14f(expo-out):刻度换、网格密、旧线压扁、端点落回
21
- // 106–126 端点标记 overshoot 落座 + 真值标签弹出;KPI 493k → 833k
22
- // 126–168 hold 42f:只有极缓推镜(1 → 1.018)
23
- import React from 'react';
24
- import { AbsoluteFill, useCurrentFrame } from 'remotion';
25
- import { EASE, bezier, mix, ramp } from '../../_fixtures/Polish';
26
- import { LOOKS, Stage, TextReveal, alpha, type } from '../../_fixtures/Look';
27
- import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
28
-
29
- export const AXIS_RESCALE_SHOCK_V2_DURATION = 168;
30
-
31
- const L = LOOKS.sand;
32
- const ACC = L.accent; // 赤陶:只给爆表段 / 事件
33
- const INK = L.ink;
34
-
35
- // 版式网格
36
- const M = 96;
37
- const X0 = 268; // 绘图区左
38
- const X1 = 1800; // 绘图区右(Dec)
39
- const PW = X1 - X0;
40
- const CEIL = 362; // 天花板规线
41
- const BASE = 902; // 基线
42
- const PH = BASE - CEIL;
43
- const SHOCK_TOP = CEIL - 226; // 冲出天花板 226px,扎进标题行
44
-
45
- const DATA = [22, 30, 26, 38, 35, 47, 44, 58, 55, 66, 72, 340];
46
- const N = DATA.length;
47
- const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
48
-
49
- const DRAW0 = 14;
50
- const DRAW1 = 56;
51
- const WARN = 50;
52
- const SHOCK0 = 62;
53
- const SHOCK1 = 76;
54
- const BEAT = 94;
55
- const RESCALE1 = 108;
56
- const MARK = 106;
57
-
58
- // 冲顶:起步慢、越冲越快,到顶微过冲
59
- const easeShock = bezier(0.7, 0, 0.36, 1.06);
60
-
61
- const xOf = (i: number) => X0 + (i / (N - 1)) * PW;
62
-
63
- export const AxisRescaleShockV2: React.FC = () => {
64
- const frame = useCurrentFrame();
65
-
66
- const rescaleP = ramp(frame, BEAT, RESCALE1 - BEAT, EASE.snappy);
67
- const range = mix(100, 400, rescaleP);
68
- const yOf = (v: number) => BASE - (v / range) * PH;
69
-
70
- // 历史段写入
71
- const drawT = ramp(frame, DRAW0, DRAW1 - DRAW0, EASE.swift) * (N - 2);
72
- const pts: Array<[number, number]> = [];
73
- for (let i = 0; i <= Math.floor(drawT); i++) pts.push([xOf(i), yOf(DATA[i])]);
74
- if (drawT < N - 2 && drawT > Math.floor(drawT)) {
75
- const i = Math.floor(drawT);
76
- const f = drawT - i;
77
- pts.push([mix(xOf(i), xOf(i + 1), f), mix(yOf(DATA[i]), yOf(DATA[i + 1]), f)]);
78
- }
79
- const lineD = pts.map(([x, y], i) => `${i ? 'L' : 'M'}${x.toFixed(2)},${y.toFixed(2)}`).join(' ');
80
-
81
- // 爆表段
82
- const shockT = ramp(frame, SHOCK0, SHOCK1 - SHOCK0, easeShock);
83
- const nx = xOf(N - 2);
84
- const ny = yOf(DATA[N - 2]);
85
- const topY = mix(SHOCK_TOP, yOf(DATA[N - 1]), rescaleP);
86
- const hx = mix(nx, X1, Math.min(1, shockT));
87
- const hy = mix(ny, topY, shockT);
88
- const shockOn = frame >= SHOCK0;
89
-
90
- // 面积(含爆表段)
91
- const all: Array<[number, number]> = shockOn ? [...pts, [hx, hy]] : pts;
92
- const areaD = all.length > 1
93
- ? `M${all[0][0]},${BASE} ` + all.map(([x, y]) => `L${x.toFixed(2)},${y.toFixed(2)}`).join(' ') + ` L${all[all.length - 1][0].toFixed(2)},${BASE} Z`
94
- : '';
95
-
96
- // 穿透天花板:线段与 y=CEIL 的交点
97
- const crossX = nx + ((ny - CEIL) / (ny - SHOCK_TOP)) * (X1 - nx);
98
- const pierced = shockOn && hy <= CEIL + 0.5 && rescaleP < 0.02;
99
- // 穿透帧(求一次):shockT 使 hy 过 CEIL 的帧
100
- let PIERCE = SHOCK1;
101
- for (let f = SHOCK0; f <= SHOCK1; f += 0.25) {
102
- if (mix(ny, SHOCK_TOP, ramp(f, SHOCK0, SHOCK1 - SHOCK0, easeShock)) <= CEIL) { PIERCE = f; break; }
103
- }
104
- const sinceP = frame - PIERCE;
105
- const crack = sinceP >= 0 ? ramp(frame, PIERCE, 8, EASE.snappy) * (1 - ramp(frame, BEAT, 14, EASE.smooth)) : 0;
106
-
107
- // 图表震:阻尼正弦,穿透帧起 12f
108
- const kick = sinceP >= 0 && sinceP < 14 ? 10 * Math.exp(-sinceP / 3.4) * Math.sin(sinceP * 1.8) : 0;
109
- // KPI 被撞:冲到顶(SHOCK1)时向上一颤
110
- const sinceTop = frame - (SHOCK1 - 2);
111
- const kpiKick = sinceTop >= 0 && sinceTop < 16 ? -14 * Math.exp(-sinceTop / 3.8) * Math.cos(sinceTop * 1.5) : 0;
112
-
113
- const warn = ramp(frame, WARN, 10, EASE.out) * (1 - ramp(frame, BEAT, 12, EASE.out));
114
- const hang = shockOn ? ramp(frame, SHOCK1 - 4, 8, EASE.out) * (1 - ramp(frame, BEAT, 14, EASE.out)) : 0;
115
- const shockW = mix(12, 7, ramp(frame, BEAT, 16, EASE.out));
116
-
117
- const markS = ramp(frame, MARK, 12, EASE.overshoot);
118
- const ripple = ramp(frame, MARK + 2, 20, EASE.out);
119
- const valS = ramp(frame, MARK + 4, 14, EASE.overshoot);
120
- const totalP = ramp(frame, MARK + 2, 20, EASE.snappy);
121
-
122
- const rule = (d: number) => ramp(frame, d, 20, EASE.snappy);
123
- const cam = mix(1, 1.018, ramp(frame, 0, AXIS_RESCALE_SHOCK_V2_DURATION, EASE.smooth));
124
-
125
- const OLD = ['25k', '50k', '75k', '100k'];
126
- const NEW = ['100k', '200k', '300k', '400k'];
127
- const tickY = (i: number) => BASE - ((i + 1) / 4) * PH;
128
-
129
- // 碎屑(两片规线残段从穿透点弹飞)
130
- const shard = (k: number) => {
131
- if (sinceP < 0 || sinceP > 32) return null;
132
- const t = sinceP / 32;
133
- const dir = k % 2 === 0 ? -1 : 1;
134
- const sp = [1, 0.75, 0.55][k];
135
- const x = crossX + dir * (18 + 190 * sp * EASE.out(t));
136
- const y = CEIL - (170 - k * 40) * EASE.out(t) + 300 * t * t;
137
- const w = [40, 30, 18][k];
138
- return (
139
- <rect key={k} x={x - w / 2} y={y - 2} width={w} height={4} fill={ACC} opacity={1 - EASE.exit(t)}
140
- transform={`rotate(${dir * (240 - k * 50) * t} ${x} ${y})`} />
141
- );
142
- };
143
-
144
- return (
145
- <AbsoluteFill style={{ background: L.bg[1], overflow: 'hidden' }}>
146
- <Stage look={L} keyLight={{ x: 0.3, y: 0.0 }} fill={{ x: 0.95, y: 0.95 }} />
147
-
148
- <div style={{ position: 'absolute', inset: 0, transform: `scale(${cam})`, transformOrigin: '60% 45%' }}>
149
- {/* 标题行 */}
150
- <div style={{ position: 'absolute', left: M, top: 92, display: 'flex', alignItems: 'center', gap: 12, ...type(32, 650, { caps: true }), color: L.ink2, opacity: ramp(frame, 0, 12, EASE.out) }}>
151
- <ShotcraftMark size={38} tone="light" style={{ marginTop: -2 }} />
152
- <span style={{ fontFamily: BRAND.font, fontWeight: 700, textTransform: 'none', letterSpacing: '0.03em', color: INK }}>{BRAND.name}</span>
153
- <span><span style={{ color: L.ink3 }}>·</span> Renders <span style={{ color: L.ink3 }}>· FY2026</span></span>
154
- </div>
155
- <div style={{ position: 'absolute', left: M - 6, top: 140, ...type(124, 850), color: INK }}>
156
- <TextReveal text="Monthly renders" by="word" variant="rise" start={2} each={18} gap={5} />
157
- </div>
158
-
159
- {/* 右上 KPI:爆表段会冲进这里 */}
160
- <div style={{ position: 'absolute', right: 1920 - 1824, top: 92, textAlign: 'right', opacity: ramp(frame, 6, 14, EASE.out) }}>
161
- <div style={{ ...type(32, 650, { caps: true }), color: totalP > 0.5 ? ACC : L.ink2 }}>FY total</div>
162
- </div>
163
- <div style={{
164
- position: 'absolute', right: 1920 - 1824, top: 140, ...type(124, 850), textAlign: 'right',
165
- color: totalP > 0.5 ? ACC : INK, transform: `translateY(${kpiKick.toFixed(2)}px)`, opacity: ramp(frame, 8, 14, EASE.out),
166
- }}>
167
- {Math.round(mix(493, 833, totalP))}k
168
- </div>
169
-
170
- {/* 图表组(震动只作用在这里) */}
171
- <div style={{ position: 'absolute', inset: 0, transform: `translateY(${kick.toFixed(2)}px)` }}>
172
- {/* 刻度 */}
173
- <div style={{ position: 'absolute', left: M, top: BASE - 48, width: 200, ...type(32, 500), color: L.ink2, opacity: rule(4) }}>0</div>
174
- {OLD.map((v, i) => {
175
- const sw = ramp(frame, BEAT + (3 - i) * 2, 12, EASE.snappy);
176
- const top = i === 3;
177
- return (
178
- <div key={i} style={{ position: 'absolute', left: M, top: tickY(i) - 48, width: 200, height: 40, opacity: rule(4 + i * 2) }}>
179
- <div style={{
180
- position: 'absolute', inset: 0, ...type(32, top ? mix(500, 750, warn) : 500),
181
- color: top && warn > 0.02 ? ACC : L.ink2, opacity: 1 - sw, transform: `translateY(${(sw * 46).toFixed(2)}px)`,
182
- filter: sw > 0.02 && sw < 0.98 ? `blur(${(Math.sin(Math.PI * sw) * 3).toFixed(2)}px)` : undefined,
183
- }}>{v}</div>
184
- <div style={{
185
- position: 'absolute', inset: 0, ...type(32, 500), color: L.ink2,
186
- opacity: sw, transform: `translateY(${((sw - 1) * 46).toFixed(2)}px)`,
187
- filter: sw > 0.02 && sw < 0.98 ? `blur(${(Math.sin(Math.PI * sw) * 3).toFixed(2)}px)` : undefined,
188
- }}>{NEW[i]}</div>
189
- </div>
190
- );
191
- })}
192
-
193
- {/* 月份 */}
194
- {MONTHS.map((m, i) => (
195
- <div key={m} style={{
196
- position: 'absolute', left: xOf(i) - 50, top: BASE + 22, width: 100, textAlign: 'center',
197
- ...type(32, i === N - 1 && shockOn ? 750 : 500), color: i === N - 1 && shockOn ? ACC : L.ink2,
198
- opacity: ramp(frame, 6 + i, 12, EASE.out),
199
- }}>{m}</div>
200
- ))}
201
-
202
- <svg width={1920} height={1080} style={{ position: 'absolute', inset: 0, overflow: 'visible' }}>
203
- <defs>
204
- <pattern id="arsHatch" width={12} height={12} patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
205
- <line x1={0} y1={0} x2={0} y2={12} stroke={INK} strokeOpacity={0.16} strokeWidth={2} />
206
- </pattern>
207
- <filter id="arsGlow" x="-50%" y="-50%" width="200%" height="200%">
208
- <feGaussianBlur stdDeviation="10" />
209
- </filter>
210
- </defs>
211
-
212
- {/* 网格:基础 3 根 + 重标加密 4 根 */}
213
- {[0, 1, 2].map((i) => (
214
- <line key={`g${i}`} x1={M} x2={mix(M, 1824, rule(2 + i * 2))} y1={tickY(i)} y2={tickY(i)} stroke={INK} strokeOpacity={0.14} strokeWidth={1.5} />
215
- ))}
216
- {[0, 1, 2, 3].map((k) => {
217
- const d = ramp(frame, BEAT + 1 + k * 2, 12, EASE.snappy);
218
- const y = BASE - ((2 * k + 1) / 8) * PH;
219
- return d > 0 ? <line key={`d${k}`} x1={M} x2={mix(M, 1824, d)} y1={y} y2={y} stroke={INK} strokeOpacity={0.08} strokeWidth={1.5} strokeDasharray="2 8" /> : null;
220
- })}
221
-
222
- {/* 面积:45° 排线 */}
223
- {areaD && <path d={areaD} fill="url(#arsHatch)" />}
224
-
225
- {/* 基线 */}
226
- <line x1={M} x2={mix(M, 1824, rule(0))} y1={BASE} y2={BASE} stroke={INK} strokeWidth={3} />
227
-
228
- {/* 天花板规线:预警转赤陶,被穿透处裂开 */}
229
- {(() => {
230
- const c = warn > 0.02 ? ACC : INK;
231
- const xr = mix(M, 1824, rule(2));
232
- const gap = 26 * crack;
233
- const op = 0.85 + 0.15 * warn;
234
- if (crack <= 0.001) return <line x1={M} x2={xr} y1={CEIL} y2={CEIL} stroke={c} strokeOpacity={op} strokeWidth={3} />;
235
- return (
236
- <>
237
- <line x1={M} x2={crossX - gap} y1={CEIL} y2={CEIL} stroke={c} strokeOpacity={op} strokeWidth={3} />
238
- <line x1={crossX + gap} x2={xr} y1={CEIL} y2={CEIL} stroke={c} strokeOpacity={op} strokeWidth={3} />
239
- </>
240
- );
241
- })()}
242
- {shard(0)}
243
- {shard(1)}
244
- {shard(2)}
245
-
246
- {/* 历史折线 */}
247
- {lineD && <path d={lineD} fill="none" stroke={INK} strokeWidth={6} strokeLinejoin="round" strokeLinecap="round" />}
248
- {/* 历史段数据点 */}
249
- {pts.map(([x, y], i) => (i < pts.length - (drawT < N - 2 ? 1 : 0) ? <circle key={i} cx={x} cy={y} r={6} fill={L.bg[0]} stroke={INK} strokeWidth={3.5} /> : null))}
250
- {/* 写入笔尖 */}
251
- {frame >= DRAW0 && frame < DRAW1 + 1 && pts.length > 0 && (
252
- <circle cx={pts[pts.length - 1][0]} cy={pts[pts.length - 1][1]} r={9} fill={INK} />
253
- )}
254
- {/* 预警脉冲:Nov 点 */}
255
- {frame >= WARN && frame < SHOCK0 + 6 && (() => {
256
- const t = ramp(frame, WARN, 16, EASE.out);
257
- return <circle cx={nx} cy={ny} r={mix(10, 46, t)} fill="none" stroke={ACC} strokeWidth={3} opacity={0.7 * (1 - t)} />;
258
- })()}
259
-
260
- {/* 爆表段 */}
261
- {shockOn && (
262
- <>
263
- {hang > 0.01 && <line x1={nx} y1={ny} x2={hx} y2={hy} stroke={ACC} strokeWidth={shockW + 16} strokeLinecap="round" opacity={0.35 * hang} filter="url(#arsGlow)" />}
264
- <line x1={nx} y1={ny} x2={hx} y2={hy} stroke={ACC} strokeWidth={shockW} strokeLinecap="round" />
265
- {markS <= 0 && <circle cx={hx} cy={hy} r={12} fill={L.bg[0]} stroke={ACC} strokeWidth={5} />}
266
- </>
267
- )}
268
- {pierced && sinceP < 10 && (
269
- <circle cx={crossX} cy={CEIL} r={mix(8, 70, ramp(frame, PIERCE, 10, EASE.out))} fill="none" stroke={ACC} strokeWidth={2.5}
270
- opacity={0.8 * (1 - ramp(frame, PIERCE, 10, EASE.out))} />
271
- )}
272
-
273
- {/* 端点标记 */}
274
- {markS > 0 && (
275
- <>
276
- {ripple < 1 && <circle cx={hx} cy={hy} r={mix(16, 64, ripple)} fill="none" stroke={ACC} strokeWidth={3} opacity={0.6 * (1 - ripple)} />}
277
- <circle cx={hx} cy={hy} r={15 * markS} fill={ACC} stroke={L.bg[0]} strokeWidth={5 * markS} />
278
- </>
279
- )}
280
- </svg>
281
-
282
- {/* 真值标签 */}
283
- {valS > 0 && (
284
- <div style={{
285
- position: 'absolute', left: hx - 40 - 330, top: hy - 70, width: 330, height: 140,
286
- transform: `scale(${valS.toFixed(4)})`, transformOrigin: '100% 50%', opacity: Math.min(1, valS * 1.6),
287
- }}>
288
- <div style={{
289
- position: 'absolute', inset: 0, background: ACC, borderRadius: 6, color: L.onAccent,
290
- display: 'flex', flexDirection: 'column', justifyContent: 'center', paddingLeft: 30,
291
- boxShadow: `0 18px 40px -12px ${alpha(L.shadow, 0.45)}`,
292
- }}>
293
- <div style={{ ...type(76, 850) }}>340k</div>
294
- <div style={{ ...type(32, 600), opacity: 0.9 * ramp(frame, MARK + 10, 10, EASE.out), marginTop: 4 }}>▲ 372% vs Nov</div>
295
- </div>
296
- <div style={{ position: 'absolute', right: -10, top: 60, width: 20, height: 20, background: ACC, transform: 'rotate(45deg)' }} />
297
- </div>
298
- )}
299
- </div>
300
- </div>
301
- </AbsoluteFill>
302
- );
303
- };
1
+ // axis-rescale-shock-v2 —— 轴爆表重标:折线正常爬升,新值顶破图表上沿冲进标题区,
2
+ // 停半拍,y 轴"哗"地重标(旧刻度飞出 / 新刻度滑入 / 网格加密 / 旧线压扁成地平线),新值落回 + 弹真值标签。
3
+ //
4
+ // 第二轮重设计(沙色瑞士海报 · 渲染月报):
5
+ // - look = sand(米色纸 + 墨黑 + 赤陶)。不再是"卡片里的小图表",而是整张画面就是一页瑞士网格财务海报:
6
+ // 左上 120px 粗黑体标题「Monthly renders」、右上同字号年度合计 KPI,下面是满版图表(1540×540 绘图区),
7
+ // 3px 墨黑基线 + 3px "天花板"粗规线 + 发丝网格,历史面积用 45° 斜线排线(印刷感),月份/刻度 32px。
8
+ // - 主角是赤陶色爆表段:Dec 新值从 Nov 起跳,越冲越快顶破天花板规线(规线在穿透点裂开、两片碎屑弹飞),
9
+ // 一路冲进右上角的 KPI 数字里(KPI 被撞得一颤),悬停半拍带柔光——"装不下"字面化。
10
+ // - 重标:14f 内旧刻度 25k–100k 向下飞出、新刻度 100k–400k 从上滑入,网格 4→8 根从左展开,
11
+ // 旧折线与斜线面积被压扁成地平线;爆表点落回 340k,弹出赤陶真值标签,KPI 滚到 833k。
12
+ // - 品牌轮:眉题换成 video-shotcraft 标志 + 字标,内容从财务营收换成渲染量(数值与版式不变)。
13
+ //
14
+ // 时间表(30fps,共 168f):
15
+ // 0–20 规线从左画出、标题逐词升起、刻度/月份淡入(第 1 帧已有纸面与规线起点)
16
+ // 14–56 历史段 Jan→Nov 写入(42f,不对称 in-out),笔尖带墨点
17
+ // 50–62 预警:天花板规线与 100k 刻度转赤陶,Nov 点一圈脉冲(预备)
18
+ // 62–76 爆表 14f:越冲越快(ease-in 主导)顶破规线(~69f 穿透:裂口 + 碎屑 + 图表震 10px)→ 冲进 KPI
19
+ // 76–94 悬停 18f:笔尖亮头 + 柔光,KPI 被撞后阻尼回位
20
+ // 94–108 重标 14f(expo-out):刻度换、网格密、旧线压扁、端点落回
21
+ // 106–126 端点标记 overshoot 落座 + 真值标签弹出;KPI 493k → 833k
22
+ // 126–168 hold 42f:只有极缓推镜(1 → 1.018)
23
+ import React from 'react';
24
+ import { AbsoluteFill, useCurrentFrame } from 'remotion';
25
+ import { EASE, bezier, mix, ramp } from '../../_fixtures/Polish';
26
+ import { LOOKS, Stage, TextReveal, alpha, type } from '../../_fixtures/Look';
27
+ import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
28
+
29
+ export const AXIS_RESCALE_SHOCK_V2_DURATION = 168;
30
+
31
+ const L = LOOKS.sand;
32
+ const ACC = L.accent; // 赤陶:只给爆表段 / 事件
33
+ const INK = L.ink;
34
+
35
+ // 版式网格
36
+ const M = 96;
37
+ const X0 = 268; // 绘图区左
38
+ const X1 = 1800; // 绘图区右(Dec)
39
+ const PW = X1 - X0;
40
+ const CEIL = 362; // 天花板规线
41
+ const BASE = 902; // 基线
42
+ const PH = BASE - CEIL;
43
+ const SHOCK_TOP = CEIL - 226; // 冲出天花板 226px,扎进标题行
44
+
45
+ const DATA = [22, 30, 26, 38, 35, 47, 44, 58, 55, 66, 72, 340];
46
+ const N = DATA.length;
47
+ const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
48
+
49
+ const DRAW0 = 14;
50
+ const DRAW1 = 56;
51
+ const WARN = 50;
52
+ const SHOCK0 = 62;
53
+ const SHOCK1 = 76;
54
+ const BEAT = 94;
55
+ const RESCALE1 = 108;
56
+ const MARK = 106;
57
+
58
+ // 冲顶:起步慢、越冲越快,到顶微过冲
59
+ const easeShock = bezier(0.7, 0, 0.36, 1.06);
60
+
61
+ const xOf = (i: number) => X0 + (i / (N - 1)) * PW;
62
+
63
+ export const AxisRescaleShockV2: React.FC = () => {
64
+ const frame = useCurrentFrame();
65
+
66
+ const rescaleP = ramp(frame, BEAT, RESCALE1 - BEAT, EASE.snappy);
67
+ const range = mix(100, 400, rescaleP);
68
+ const yOf = (v: number) => BASE - (v / range) * PH;
69
+
70
+ // 历史段写入
71
+ const drawT = ramp(frame, DRAW0, DRAW1 - DRAW0, EASE.swift) * (N - 2);
72
+ const pts: Array<[number, number]> = [];
73
+ for (let i = 0; i <= Math.floor(drawT); i++) pts.push([xOf(i), yOf(DATA[i])]);
74
+ if (drawT < N - 2 && drawT > Math.floor(drawT)) {
75
+ const i = Math.floor(drawT);
76
+ const f = drawT - i;
77
+ pts.push([mix(xOf(i), xOf(i + 1), f), mix(yOf(DATA[i]), yOf(DATA[i + 1]), f)]);
78
+ }
79
+ const lineD = pts.map(([x, y], i) => `${i ? 'L' : 'M'}${x.toFixed(2)},${y.toFixed(2)}`).join(' ');
80
+
81
+ // 爆表段
82
+ const shockT = ramp(frame, SHOCK0, SHOCK1 - SHOCK0, easeShock);
83
+ const nx = xOf(N - 2);
84
+ const ny = yOf(DATA[N - 2]);
85
+ const topY = mix(SHOCK_TOP, yOf(DATA[N - 1]), rescaleP);
86
+ const hx = mix(nx, X1, Math.min(1, shockT));
87
+ const hy = mix(ny, topY, shockT);
88
+ const shockOn = frame >= SHOCK0;
89
+
90
+ // 面积(含爆表段)
91
+ const all: Array<[number, number]> = shockOn ? [...pts, [hx, hy]] : pts;
92
+ const areaD = all.length > 1
93
+ ? `M${all[0][0]},${BASE} ` + all.map(([x, y]) => `L${x.toFixed(2)},${y.toFixed(2)}`).join(' ') + ` L${all[all.length - 1][0].toFixed(2)},${BASE} Z`
94
+ : '';
95
+
96
+ // 穿透天花板:线段与 y=CEIL 的交点
97
+ const crossX = nx + ((ny - CEIL) / (ny - SHOCK_TOP)) * (X1 - nx);
98
+ const pierced = shockOn && hy <= CEIL + 0.5 && rescaleP < 0.02;
99
+ // 穿透帧(求一次):shockT 使 hy 过 CEIL 的帧
100
+ let PIERCE = SHOCK1;
101
+ for (let f = SHOCK0; f <= SHOCK1; f += 0.25) {
102
+ if (mix(ny, SHOCK_TOP, ramp(f, SHOCK0, SHOCK1 - SHOCK0, easeShock)) <= CEIL) { PIERCE = f; break; }
103
+ }
104
+ const sinceP = frame - PIERCE;
105
+ const crack = sinceP >= 0 ? ramp(frame, PIERCE, 8, EASE.snappy) * (1 - ramp(frame, BEAT, 14, EASE.smooth)) : 0;
106
+
107
+ // 图表震:阻尼正弦,穿透帧起 12f
108
+ const kick = sinceP >= 0 && sinceP < 14 ? 10 * Math.exp(-sinceP / 3.4) * Math.sin(sinceP * 1.8) : 0;
109
+ // KPI 被撞:冲到顶(SHOCK1)时向上一颤
110
+ const sinceTop = frame - (SHOCK1 - 2);
111
+ const kpiKick = sinceTop >= 0 && sinceTop < 16 ? -14 * Math.exp(-sinceTop / 3.8) * Math.cos(sinceTop * 1.5) : 0;
112
+
113
+ const warn = ramp(frame, WARN, 10, EASE.out) * (1 - ramp(frame, BEAT, 12, EASE.out));
114
+ const hang = shockOn ? ramp(frame, SHOCK1 - 4, 8, EASE.out) * (1 - ramp(frame, BEAT, 14, EASE.out)) : 0;
115
+ const shockW = mix(12, 7, ramp(frame, BEAT, 16, EASE.out));
116
+
117
+ const markS = ramp(frame, MARK, 12, EASE.overshoot);
118
+ const ripple = ramp(frame, MARK + 2, 20, EASE.out);
119
+ const valS = ramp(frame, MARK + 4, 14, EASE.overshoot);
120
+ const totalP = ramp(frame, MARK + 2, 20, EASE.snappy);
121
+
122
+ const rule = (d: number) => ramp(frame, d, 20, EASE.snappy);
123
+ const cam = mix(1, 1.018, ramp(frame, 0, AXIS_RESCALE_SHOCK_V2_DURATION, EASE.smooth));
124
+
125
+ const OLD = ['25k', '50k', '75k', '100k'];
126
+ const NEW = ['100k', '200k', '300k', '400k'];
127
+ const tickY = (i: number) => BASE - ((i + 1) / 4) * PH;
128
+
129
+ // 碎屑(两片规线残段从穿透点弹飞)
130
+ const shard = (k: number) => {
131
+ if (sinceP < 0 || sinceP > 32) return null;
132
+ const t = sinceP / 32;
133
+ const dir = k % 2 === 0 ? -1 : 1;
134
+ const sp = [1, 0.75, 0.55][k];
135
+ const x = crossX + dir * (18 + 190 * sp * EASE.out(t));
136
+ const y = CEIL - (170 - k * 40) * EASE.out(t) + 300 * t * t;
137
+ const w = [40, 30, 18][k];
138
+ return (
139
+ <rect key={k} x={x - w / 2} y={y - 2} width={w} height={4} fill={ACC} opacity={1 - EASE.exit(t)}
140
+ transform={`rotate(${dir * (240 - k * 50) * t} ${x} ${y})`} />
141
+ );
142
+ };
143
+
144
+ return (
145
+ <AbsoluteFill style={{ background: L.bg[1], overflow: 'hidden' }}>
146
+ <Stage look={L} keyLight={{ x: 0.3, y: 0.0 }} fill={{ x: 0.95, y: 0.95 }} />
147
+
148
+ <div style={{ position: 'absolute', inset: 0, transform: `scale(${cam})`, transformOrigin: '60% 45%' }}>
149
+ {/* 标题行 */}
150
+ <div style={{ position: 'absolute', left: M, top: 92, display: 'flex', alignItems: 'center', gap: 12, ...type(32, 650, { caps: true }), color: L.ink2, opacity: ramp(frame, 0, 12, EASE.out) }}>
151
+ <ShotcraftMark size={38} tone="light" style={{ marginTop: -2 }} />
152
+ <span style={{ fontFamily: BRAND.font, fontWeight: 700, textTransform: 'none', letterSpacing: '0.03em', color: INK }}>{BRAND.name}</span>
153
+ <span><span style={{ color: L.ink3 }}>·</span> Renders <span style={{ color: L.ink3 }}>· FY2026</span></span>
154
+ </div>
155
+ <div style={{ position: 'absolute', left: M - 6, top: 140, ...type(124, 850), color: INK }}>
156
+ <TextReveal text="Monthly renders" by="word" variant="rise" start={2} each={18} gap={5} />
157
+ </div>
158
+
159
+ {/* 右上 KPI:爆表段会冲进这里 */}
160
+ <div style={{ position: 'absolute', right: 1920 - 1824, top: 92, textAlign: 'right', opacity: ramp(frame, 6, 14, EASE.out) }}>
161
+ <div style={{ ...type(32, 650, { caps: true }), color: totalP > 0.5 ? ACC : L.ink2 }}>FY total</div>
162
+ </div>
163
+ <div style={{
164
+ position: 'absolute', right: 1920 - 1824, top: 140, ...type(124, 850), textAlign: 'right',
165
+ color: totalP > 0.5 ? ACC : INK, transform: `translateY(${kpiKick.toFixed(2)}px)`, opacity: ramp(frame, 8, 14, EASE.out),
166
+ }}>
167
+ {Math.round(mix(493, 833, totalP))}k
168
+ </div>
169
+
170
+ {/* 图表组(震动只作用在这里) */}
171
+ <div style={{ position: 'absolute', inset: 0, transform: `translateY(${kick.toFixed(2)}px)` }}>
172
+ {/* 刻度 */}
173
+ <div style={{ position: 'absolute', left: M, top: BASE - 48, width: 200, ...type(32, 500), color: L.ink2, opacity: rule(4) }}>0</div>
174
+ {OLD.map((v, i) => {
175
+ const sw = ramp(frame, BEAT + (3 - i) * 2, 12, EASE.snappy);
176
+ const top = i === 3;
177
+ return (
178
+ <div key={i} style={{ position: 'absolute', left: M, top: tickY(i) - 48, width: 200, height: 40, opacity: rule(4 + i * 2) }}>
179
+ <div style={{
180
+ position: 'absolute', inset: 0, ...type(32, top ? mix(500, 750, warn) : 500),
181
+ color: top && warn > 0.02 ? ACC : L.ink2, opacity: 1 - sw, transform: `translateY(${(sw * 46).toFixed(2)}px)`,
182
+ filter: sw > 0.02 && sw < 0.98 ? `blur(${(Math.sin(Math.PI * sw) * 3).toFixed(2)}px)` : undefined,
183
+ }}>{v}</div>
184
+ <div style={{
185
+ position: 'absolute', inset: 0, ...type(32, 500), color: L.ink2,
186
+ opacity: sw, transform: `translateY(${((sw - 1) * 46).toFixed(2)}px)`,
187
+ filter: sw > 0.02 && sw < 0.98 ? `blur(${(Math.sin(Math.PI * sw) * 3).toFixed(2)}px)` : undefined,
188
+ }}>{NEW[i]}</div>
189
+ </div>
190
+ );
191
+ })}
192
+
193
+ {/* 月份 */}
194
+ {MONTHS.map((m, i) => (
195
+ <div key={m} style={{
196
+ position: 'absolute', left: xOf(i) - 50, top: BASE + 22, width: 100, textAlign: 'center',
197
+ ...type(32, i === N - 1 && shockOn ? 750 : 500), color: i === N - 1 && shockOn ? ACC : L.ink2,
198
+ opacity: ramp(frame, 6 + i, 12, EASE.out),
199
+ }}>{m}</div>
200
+ ))}
201
+
202
+ <svg width={1920} height={1080} style={{ position: 'absolute', inset: 0, overflow: 'visible' }}>
203
+ <defs>
204
+ <pattern id="arsHatch" width={12} height={12} patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
205
+ <line x1={0} y1={0} x2={0} y2={12} stroke={INK} strokeOpacity={0.16} strokeWidth={2} />
206
+ </pattern>
207
+ <filter id="arsGlow" x="-50%" y="-50%" width="200%" height="200%">
208
+ <feGaussianBlur stdDeviation="10" />
209
+ </filter>
210
+ </defs>
211
+
212
+ {/* 网格:基础 3 根 + 重标加密 4 根 */}
213
+ {[0, 1, 2].map((i) => (
214
+ <line key={`g${i}`} x1={M} x2={mix(M, 1824, rule(2 + i * 2))} y1={tickY(i)} y2={tickY(i)} stroke={INK} strokeOpacity={0.14} strokeWidth={1.5} />
215
+ ))}
216
+ {[0, 1, 2, 3].map((k) => {
217
+ const d = ramp(frame, BEAT + 1 + k * 2, 12, EASE.snappy);
218
+ const y = BASE - ((2 * k + 1) / 8) * PH;
219
+ return d > 0 ? <line key={`d${k}`} x1={M} x2={mix(M, 1824, d)} y1={y} y2={y} stroke={INK} strokeOpacity={0.08} strokeWidth={1.5} strokeDasharray="2 8" /> : null;
220
+ })}
221
+
222
+ {/* 面积:45° 排线 */}
223
+ {areaD && <path d={areaD} fill="url(#arsHatch)" />}
224
+
225
+ {/* 基线 */}
226
+ <line x1={M} x2={mix(M, 1824, rule(0))} y1={BASE} y2={BASE} stroke={INK} strokeWidth={3} />
227
+
228
+ {/* 天花板规线:预警转赤陶,被穿透处裂开 */}
229
+ {(() => {
230
+ const c = warn > 0.02 ? ACC : INK;
231
+ const xr = mix(M, 1824, rule(2));
232
+ const gap = 26 * crack;
233
+ const op = 0.85 + 0.15 * warn;
234
+ if (crack <= 0.001) return <line x1={M} x2={xr} y1={CEIL} y2={CEIL} stroke={c} strokeOpacity={op} strokeWidth={3} />;
235
+ return (
236
+ <>
237
+ <line x1={M} x2={crossX - gap} y1={CEIL} y2={CEIL} stroke={c} strokeOpacity={op} strokeWidth={3} />
238
+ <line x1={crossX + gap} x2={xr} y1={CEIL} y2={CEIL} stroke={c} strokeOpacity={op} strokeWidth={3} />
239
+ </>
240
+ );
241
+ })()}
242
+ {shard(0)}
243
+ {shard(1)}
244
+ {shard(2)}
245
+
246
+ {/* 历史折线 */}
247
+ {lineD && <path d={lineD} fill="none" stroke={INK} strokeWidth={6} strokeLinejoin="round" strokeLinecap="round" />}
248
+ {/* 历史段数据点 */}
249
+ {pts.map(([x, y], i) => (i < pts.length - (drawT < N - 2 ? 1 : 0) ? <circle key={i} cx={x} cy={y} r={6} fill={L.bg[0]} stroke={INK} strokeWidth={3.5} /> : null))}
250
+ {/* 写入笔尖 */}
251
+ {frame >= DRAW0 && frame < DRAW1 + 1 && pts.length > 0 && (
252
+ <circle cx={pts[pts.length - 1][0]} cy={pts[pts.length - 1][1]} r={9} fill={INK} />
253
+ )}
254
+ {/* 预警脉冲:Nov 点 */}
255
+ {frame >= WARN && frame < SHOCK0 + 6 && (() => {
256
+ const t = ramp(frame, WARN, 16, EASE.out);
257
+ return <circle cx={nx} cy={ny} r={mix(10, 46, t)} fill="none" stroke={ACC} strokeWidth={3} opacity={0.7 * (1 - t)} />;
258
+ })()}
259
+
260
+ {/* 爆表段 */}
261
+ {shockOn && (
262
+ <>
263
+ {hang > 0.01 && <line x1={nx} y1={ny} x2={hx} y2={hy} stroke={ACC} strokeWidth={shockW + 16} strokeLinecap="round" opacity={0.35 * hang} filter="url(#arsGlow)" />}
264
+ <line x1={nx} y1={ny} x2={hx} y2={hy} stroke={ACC} strokeWidth={shockW} strokeLinecap="round" />
265
+ {markS <= 0 && <circle cx={hx} cy={hy} r={12} fill={L.bg[0]} stroke={ACC} strokeWidth={5} />}
266
+ </>
267
+ )}
268
+ {pierced && sinceP < 10 && (
269
+ <circle cx={crossX} cy={CEIL} r={mix(8, 70, ramp(frame, PIERCE, 10, EASE.out))} fill="none" stroke={ACC} strokeWidth={2.5}
270
+ opacity={0.8 * (1 - ramp(frame, PIERCE, 10, EASE.out))} />
271
+ )}
272
+
273
+ {/* 端点标记 */}
274
+ {markS > 0 && (
275
+ <>
276
+ {ripple < 1 && <circle cx={hx} cy={hy} r={mix(16, 64, ripple)} fill="none" stroke={ACC} strokeWidth={3} opacity={0.6 * (1 - ripple)} />}
277
+ <circle cx={hx} cy={hy} r={15 * markS} fill={ACC} stroke={L.bg[0]} strokeWidth={5 * markS} />
278
+ </>
279
+ )}
280
+ </svg>
281
+
282
+ {/* 真值标签 */}
283
+ {valS > 0 && (
284
+ <div style={{
285
+ position: 'absolute', left: hx - 40 - 330, top: hy - 70, width: 330, height: 140,
286
+ transform: `scale(${valS.toFixed(4)})`, transformOrigin: '100% 50%', opacity: Math.min(1, valS * 1.6),
287
+ }}>
288
+ <div style={{
289
+ position: 'absolute', inset: 0, background: ACC, borderRadius: 6, color: L.onAccent,
290
+ display: 'flex', flexDirection: 'column', justifyContent: 'center', paddingLeft: 30,
291
+ boxShadow: `0 18px 40px -12px ${alpha(L.shadow, 0.45)}`,
292
+ }}>
293
+ <div style={{ ...type(76, 850) }}>340k</div>
294
+ <div style={{ ...type(32, 600), opacity: 0.9 * ramp(frame, MARK + 10, 10, EASE.out), marginTop: 4 }}>▲ 372% vs Nov</div>
295
+ </div>
296
+ <div style={{ position: 'absolute', right: -10, top: 60, width: 20, height: 20, background: ACC, transform: 'rotate(45deg)' }} />
297
+ </div>
298
+ )}
299
+ </div>
300
+ </div>
301
+ </AbsoluteFill>
302
+ );
303
+ };