dsh-drawai 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/README.md +4 -3
  2. package/lib/index.js +7777 -7719
  3. package/lib/motion/asset-pack.js +394 -394
  4. package/lib/motion/assets.js +291 -291
  5. package/lib/motion/demo-assets-lock.js +10 -10
  6. package/lib/motion/mgstyles/vendor/README.md +28 -28
  7. package/lib/motion/mgstyles/vendor/modules/d3/LICENSE +13 -13
  8. package/lib/motion/mgstyles/vendor/modules/d3/dist/d3.min.js +2 -2
  9. package/lib/motion/mgstyles/vendor/modules/opentype.js/LICENSE +20 -20
  10. package/lib/motion/mgstyles/vendor/modules/opentype.js/dist/opentype.mjs +14460 -14460
  11. package/lib/motion/mgstyles/vendor/modules/simplex-noise/LICENSE +21 -21
  12. package/lib/motion/mgstyles/vendor/modules/simplex-noise/dist/esm/simplex-noise.js +465 -465
  13. package/lib/motion/mgstyles/vendor/modules/topojson-client/LICENSE +13 -13
  14. package/lib/motion/mgstyles/vendor/modules/topojson-client/dist/topojson-client.min.js +2 -2
  15. package/lib/motion/render.js +179 -179
  16. package/lib/motion/shotcraft/upstream/SKILL.md +286 -286
  17. package/lib/motion/shotcraft/upstream/assets/lib/Caption.tsx +54 -54
  18. package/lib/motion/shotcraft/upstream/assets/lib/ClipCard.tsx +200 -200
  19. package/lib/motion/shotcraft/upstream/assets/lib/DigitRoll.tsx +45 -45
  20. package/lib/motion/shotcraft/upstream/assets/lib/FlashCut.tsx +20 -20
  21. package/lib/motion/shotcraft/upstream/assets/lib/FlatPanel.tsx +65 -65
  22. package/lib/motion/shotcraft/upstream/assets/lib/PageCam.tsx +151 -151
  23. package/lib/motion/shotcraft/upstream/assets/lib/VerticalTicker.tsx +129 -129
  24. package/lib/motion/shotcraft/upstream/assets/lib/helpers/camera.tsx +75 -75
  25. package/lib/motion/shotcraft/upstream/assets/lib/helpers/motion.ts +40 -40
  26. package/lib/motion/shotcraft/upstream/assets/lib/helpers/rand.ts +11 -11
  27. package/lib/motion/shotcraft/upstream/assets/lib/helpers/shake.ts +10 -10
  28. package/lib/motion/shotcraft/upstream/assets/scripts/build-readme-cover.mjs +49 -49
  29. package/lib/motion/shotcraft/upstream/assets/scripts/capture-template.mjs +210 -210
  30. package/lib/motion/shotcraft/upstream/assets/scripts/sfx-source.py +423 -423
  31. package/lib/motion/shotcraft/upstream/assets/scripts/smoke-render-demos.py +170 -170
  32. package/lib/motion/shotcraft/upstream/assets/scripts/test_sfx_source.py +157 -157
  33. package/lib/motion/shotcraft/upstream/demos/README.md +120 -120
  34. package/lib/motion/shotcraft/upstream/demos/_fixtures/Brand.tsx +112 -112
  35. package/lib/motion/shotcraft/upstream/demos/_fixtures/Fixtures.tsx +647 -647
  36. package/lib/motion/shotcraft/upstream/demos/_fixtures/Look.tsx +316 -316
  37. package/lib/motion/shotcraft/upstream/demos/_fixtures/Motion.tsx +82 -82
  38. package/lib/motion/shotcraft/upstream/demos/_fixtures/PageCam2D.tsx +115 -115
  39. package/lib/motion/shotcraft/upstream/demos/_fixtures/Polish.tsx +243 -243
  40. package/lib/motion/shotcraft/upstream/demos/_textures/live-layout.json +388 -388
  41. package/lib/motion/shotcraft/upstream/demos/camera/basic-3d-scene/Basic3DScene.tsx +250 -250
  42. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashImpactReal.tsx +305 -305
  43. package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashZoomReal.tsx +246 -246
  44. package/lib/motion/shotcraft/upstream/demos/camera/cursor-flyover/CursorFlyover.tsx +390 -390
  45. package/lib/motion/shotcraft/upstream/demos/camera/depth-layer-moves/MultiplaneReal.tsx +138 -138
  46. package/lib/motion/shotcraft/upstream/demos/camera/graze-face-tour/GrazeFaceTour.tsx +542 -542
  47. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/OverheadTabletopDrop.tsx +315 -315
  48. package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/TiltReveal.tsx +299 -299
  49. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/DroneDiveLanding.tsx +173 -173
  50. package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/ExplodedView.tsx +348 -348
  51. package/lib/motion/shotcraft/upstream/demos/camera/steep-tilt-glide/SteepTiltGlide.tsx +366 -366
  52. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx +279 -279
  53. package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/PullBackIsolation.tsx +184 -184
  54. package/lib/motion/shotcraft/upstream/demos/camera/terminal-3d/Terminal3D.tsx +390 -390
  55. package/lib/motion/shotcraft/upstream/demos/data/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +155 -155
  56. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/AxisRescaleShockV2.tsx +303 -303
  57. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/OscilloscopeStreamV2.tsx +290 -290
  58. package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/UnitDotSwarmRegroupV2.tsx +278 -278
  59. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/NeedleSweepSelftest.tsx +307 -307
  60. package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/TapeScrollFixedPointer.tsx +215 -215
  61. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/BrakeReticleLock.tsx +299 -299
  62. package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/ChangelogScrollBrake.tsx +232 -232
  63. package/lib/motion/shotcraft/upstream/demos/data/timeline-travel/TimelineTravel.tsx +290 -290
  64. package/lib/motion/shotcraft/upstream/demos/effects/assemble-then-type-flyin/AssembleThenTypeFlyin.tsx +273 -273
  65. package/lib/motion/shotcraft/upstream/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx +167 -167
  66. package/lib/motion/shotcraft/upstream/demos/effects/brand-frame-snap/BrandFrameSnap.tsx +536 -536
  67. package/lib/motion/shotcraft/upstream/demos/effects/fui-hud-moves/ReticleLockOn.tsx +164 -164
  68. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/FlylineArc.tsx +175 -175
  69. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/GlowOrbAmbient.tsx +197 -197
  70. package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/OrbFlylineRelay.tsx +241 -241
  71. package/lib/motion/shotcraft/upstream/demos/effects/icon-performance-moves/AttentionBounce.tsx +279 -279
  72. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/AnimeImpact.tsx +230 -230
  73. package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/HitCounter.tsx +345 -345
  74. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SheenSweepRetry.tsx +275 -275
  75. package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SpotlightSweepReveal.tsx +229 -229
  76. package/lib/motion/shotcraft/upstream/demos/effects/radial-ripple-phone-chips/RadialRipplePhoneChips.tsx +312 -312
  77. package/lib/motion/shotcraft/upstream/demos/effects/riso-print-hits/RisoMisregistrationHit.tsx +222 -222
  78. package/lib/motion/shotcraft/upstream/demos/effects/scan-bracket-sweep/ScanBracketSweep.tsx +295 -295
  79. package/lib/motion/shotcraft/upstream/demos/effects/scanline-annotate-focus/ScanlineAnnotateFocus.tsx +329 -329
  80. package/lib/motion/shotcraft/upstream/demos/effects/scanline-assemble-flyin/ScanlineAssembleFlyin.tsx +315 -315
  81. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ImpactBurstKit.tsx +264 -264
  82. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/KanadaPerspectiveSnap.tsx +260 -260
  83. package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ScoreSlam.tsx +263 -263
  84. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/CornerSpotlightReveal.tsx +123 -123
  85. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +187 -187
  86. package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/SlideSpotlightPan.tsx +175 -175
  87. package/lib/motion/shotcraft/upstream/demos/interaction/autolayout-gap-dial/AutolayoutGapDial.tsx +305 -305
  88. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/DiagramCascadeBuild.tsx +350 -350
  89. package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +352 -352
  90. package/lib/motion/shotcraft/upstream/demos/interaction/chip-grid-single-select-blackout/ChipGridSingleSelectBlackout.tsx +218 -218
  91. package/lib/motion/shotcraft/upstream/demos/interaction/collab-cursor-moves/CursorCastEnsemble.tsx +297 -297
  92. package/lib/motion/shotcraft/upstream/demos/interaction/glass-pill-dictation-typing/GlassPillDictationTyping.tsx +157 -157
  93. package/lib/motion/shotcraft/upstream/demos/interaction/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +218 -218
  94. package/lib/motion/shotcraft/upstream/demos/interaction/picker-carousel-feature-cycle/PickerCarouselFeatureCycle.tsx +202 -202
  95. package/lib/motion/shotcraft/upstream/demos/interaction/segmented-thumb-hero/SegmentedThumbHero.tsx +265 -265
  96. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/PaletteThemeRipple.tsx +457 -457
  97. package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/ThemeSweepToggle.tsx +446 -446
  98. package/lib/motion/shotcraft/upstream/demos/interaction/type-and-filter/TypeAndFilter.tsx +249 -249
  99. package/lib/motion/shotcraft/upstream/demos/interaction/voice-waveform-live/VoiceWaveformLive.tsx +278 -278
  100. package/lib/motion/shotcraft/upstream/demos/opening/crane-rise-reveal/CraneRiseReveal.tsx +332 -332
  101. package/lib/motion/shotcraft/upstream/demos/opening/dataviz-landscape-open/DatavizLandscapeOpen.tsx +358 -358
  102. package/lib/motion/shotcraft/upstream/demos/opening/fracture/Fracture.tsx +201 -201
  103. package/lib/motion/shotcraft/upstream/demos/opening/icon-field-colorize/IconFieldColorize.tsx +200 -200
  104. package/lib/motion/shotcraft/upstream/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx +208 -208
  105. package/lib/motion/shotcraft/upstream/demos/opening/magician-card-flourish/MagicianCardFlourish.tsx +341 -341
  106. package/lib/motion/shotcraft/upstream/demos/opening/orbit-ring-title-open/OrbitRingTitleOpen.tsx +389 -389
  107. package/lib/motion/shotcraft/upstream/demos/opening/spotlight-hero-card/SpotlightHeroCard.tsx +293 -293
  108. package/lib/motion/shotcraft/upstream/demos/opening/stroke-segment-build/StrokeSegmentBuild.tsx +183 -183
  109. package/lib/motion/shotcraft/upstream/demos/opening/text-as-mask/TextAsMask.tsx +245 -245
  110. package/lib/motion/shotcraft/upstream/demos/outro/grain-dissolve/GrainDissolve.tsx +222 -222
  111. package/lib/motion/shotcraft/upstream/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx +223 -223
  112. package/lib/motion/shotcraft/upstream/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx +217 -217
  113. package/lib/motion/shotcraft/upstream/demos/outro/outro-group-photo-launch/OutroGroupPhotoLaunch.tsx +343 -343
  114. package/lib/motion/shotcraft/upstream/demos/outro/ui-strip-away-outro/UiStripAwayOutro.tsx +357 -357
  115. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/IconFlipBloomLogo.tsx +187 -187
  116. package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/InputMorphsIntoLogo.tsx +333 -333
  117. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-cut-moves/PaparazziFlash.tsx +274 -274
  118. package/lib/motion/shotcraft/upstream/demos/rhythm/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +270 -270
  119. package/lib/motion/shotcraft/upstream/demos/rhythm/panel-grid-moves/ComicPanelSplit.tsx +430 -430
  120. package/lib/motion/shotcraft/upstream/demos/rhythm/quad-split-parallel-scenes/QuadSplitParallelScenes.tsx +252 -252
  121. package/lib/motion/shotcraft/upstream/demos/rhythm/rhythm-interrupt-moves/JumpCutPunchIn.tsx +106 -106
  122. package/lib/motion/shotcraft/upstream/demos/rhythm/sakuga-timing-shift/SakugaTimingShift.tsx +288 -288
  123. package/lib/motion/shotcraft/upstream/demos/rhythm/speed-ramp-freeze/FreezeAnnotateReal.tsx +362 -362
  124. package/lib/motion/shotcraft/upstream/demos/rhythm/trailer-grammar-moves/TrailerBumper.tsx +168 -168
  125. package/lib/motion/shotcraft/upstream/demos/transition/bottom-push-stack-wipe/BottomPushStackWipe.tsx +310 -310
  126. package/lib/motion/shotcraft/upstream/demos/transition/card-flip-reveal/CardFlipReveal.tsx +261 -261
  127. package/lib/motion/shotcraft/upstream/demos/transition/card-flock-tumble/CardFlockTumble.tsx +459 -459
  128. package/lib/motion/shotcraft/upstream/demos/transition/circle-match-iris/CircleMatchIris.tsx +294 -294
  129. package/lib/motion/shotcraft/upstream/demos/transition/gradient-transition/GradientTransition.tsx +161 -161
  130. package/lib/motion/shotcraft/upstream/demos/transition/line-carry-transition/LineCarryTransition.tsx +248 -248
  131. package/lib/motion/shotcraft/upstream/demos/transition/mosaic-reframe/MosaicReframe.tsx +359 -359
  132. package/lib/motion/shotcraft/upstream/demos/transition/page-turn-transitions/BarnDoorSplit.tsx +227 -227
  133. package/lib/motion/shotcraft/upstream/demos/transition/print-texture-transitions/InkBleedReveal.tsx +162 -162
  134. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/PortalWipeV2.tsx +248 -248
  135. package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/WhipBrakeReal.tsx +186 -186
  136. package/lib/motion/shotcraft/upstream/demos/transition/tear-streak-transitions/GlitchDisplace.tsx +355 -355
  137. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/InvisibleCut.tsx +272 -272
  138. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/LightLeakBurn.tsx +262 -262
  139. package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/VersusSlam.tsx +217 -217
  140. package/lib/motion/shotcraft/upstream/demos/transition/transition-travel/LetterformZoom.tsx +285 -285
  141. package/lib/motion/shotcraft/upstream/demos/transition/white-flash-logo-simplify-cut/WhiteFlashLogoSimplifyCut.tsx +205 -205
  142. package/lib/motion/shotcraft/upstream/demos/transition/wipe-transitions/BlindsSlice.tsx +178 -178
  143. package/lib/motion/shotcraft/upstream/demos/typography/blur-slide/BlurSlide.tsx +147 -147
  144. package/lib/motion/shotcraft/upstream/demos/typography/brace-expand/BraceExpand.tsx +143 -143
  145. package/lib/motion/shotcraft/upstream/demos/typography/brand-ink-open/BrandInkOpen.tsx +134 -134
  146. package/lib/motion/shotcraft/upstream/demos/typography/countdown-arc-scatter/CountdownArcScatter.tsx +217 -217
  147. package/lib/motion/shotcraft/upstream/demos/typography/flying-words/FlyingWords.tsx +198 -198
  148. package/lib/motion/shotcraft/upstream/demos/typography/glitch-cycle/GlitchCycle.tsx +221 -221
  149. package/lib/motion/shotcraft/upstream/demos/typography/gradient-word-sweep/GradientWordSweep.tsx +312 -312
  150. package/lib/motion/shotcraft/upstream/demos/typography/lead-word-zoom-assemble/LeadWordZoomAssemble.tsx +261 -261
  151. package/lib/motion/shotcraft/upstream/demos/typography/marker-underline-title/MarkerUnderlineTitle.tsx +121 -121
  152. package/lib/motion/shotcraft/upstream/demos/typography/outline-word-fill/OutlineWordFill.tsx +153 -153
  153. package/lib/motion/shotcraft/upstream/demos/typography/paper-title-card/PaperTitleCard.tsx +179 -179
  154. package/lib/motion/shotcraft/upstream/demos/typography/pill-chip-slot-cycle-handled/PillChipSlotCycleHandled.tsx +140 -140
  155. package/lib/motion/shotcraft/upstream/demos/typography/pill-slot-cycle/PillSlotCycle.tsx +309 -309
  156. package/lib/motion/shotcraft/upstream/demos/typography/text-column-converge/TextColumnConverge.tsx +191 -191
  157. package/lib/motion/shotcraft/upstream/demos/typography/title-demote-to-label/TitleDemoteToLabel.tsx +292 -292
  158. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/LetterformDriftAssembly.tsx +135 -135
  159. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/SplitTextStagger.tsx +124 -124
  160. package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/TextOnPath.tsx +255 -255
  161. package/lib/motion/shotcraft/upstream/demos/typography/type-entrance-moves/LetterDropPhysics.tsx +173 -173
  162. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/FontWeightPump.tsx +225 -225
  163. package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/KaraokeFillSync.tsx +141 -141
  164. package/lib/motion/shotcraft/upstream/demos/typography/typewriter-moves/TypewriterErrorRetype.tsx +137 -137
  165. package/lib/motion/shotcraft/upstream/demos/typography/vertical-word-roll-blur-cycle/VerticalWordRollBlurCycle.tsx +147 -147
  166. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-filmstrip/WordRelayFilmstrip.tsx +409 -409
  167. package/lib/motion/shotcraft/upstream/demos/typography/word-relay-geometry/WordRelayGeometry.tsx +280 -280
  168. package/lib/motion/shotcraft/upstream/demos/ui-entrance/avatar-bracket-carousel/AvatarBracketCarousel.tsx +271 -271
  169. package/lib/motion/shotcraft/upstream/demos/ui-entrance/bezier-source-converge-merge/BezierSourceConvergeMerge.tsx +385 -385
  170. package/lib/motion/shotcraft/upstream/demos/ui-entrance/card-stack/CardStack.tsx +312 -312
  171. package/lib/motion/shotcraft/upstream/demos/ui-entrance/carousel-3d/Carousel3D.tsx +303 -303
  172. package/lib/motion/shotcraft/upstream/demos/ui-entrance/clipcard-looping/ClipCardLooping.tsx +77 -77
  173. package/lib/motion/shotcraft/upstream/demos/ui-entrance/cloner-depth-echo/ClonerDepthEcho.tsx +311 -311
  174. package/lib/motion/shotcraft/upstream/demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx +307 -307
  175. package/lib/motion/shotcraft/upstream/demos/ui-entrance/doc-park-left-pill-deal/DocParkLeftPillDeal.tsx +349 -349
  176. package/lib/motion/shotcraft/upstream/demos/ui-entrance/document-typewriter-reveal/DocumentTypewriterReveal.tsx +255 -255
  177. package/lib/motion/shotcraft/upstream/demos/ui-entrance/draw-svg-trace/DrawSvgTrace.tsx +244 -244
  178. package/lib/motion/shotcraft/upstream/demos/ui-entrance/element-body-moves/ContactShadowLift.tsx +217 -217
  179. package/lib/motion/shotcraft/upstream/demos/ui-entrance/integration-hub-map/IntegrationHubMap.tsx +652 -652
  180. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-reveal/ListReveal.tsx +153 -153
  181. package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-stack-press/ListStackPress.tsx +238 -238
  182. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-forerun/NeonFrameForerun.tsx +324 -324
  183. package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +354 -354
  184. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/PageWaterfallWall.tsx +101 -101
  185. package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/VerticalTicker.tsx +129 -129
  186. package/lib/motion/shotcraft/upstream/demos/ui-entrance/product-card-progressive-assemble/ProductCardProgressiveAssemble.tsx +297 -297
  187. package/lib/motion/shotcraft/upstream/demos/ui-entrance/radial-wave/RadialWave.tsx +57 -57
  188. package/lib/motion/shotcraft/upstream/demos/ui-entrance/research-card-stack-scroll/ResearchCardStackScroll.tsx +155 -155
  189. package/lib/motion/shotcraft/upstream/demos/ui-entrance/row-embed/RowEmbed.tsx +175 -175
  190. package/lib/motion/shotcraft/upstream/demos/ui-entrance/value-stagger-gradient/ValueStaggerGradient.tsx +153 -153
  191. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/BentoLightUp.tsx +146 -146
  192. package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/WireframeDrawOn.tsx +226 -226
  193. package/lib/motion/shotcraft/upstream/gallery/api/library.json +1 -1
  194. package/lib/motion/shotcraft/upstream/references/aesthetic-rules.md +193 -193
  195. package/lib/motion/shotcraft/upstream/references/final-review.md +121 -121
  196. package/lib/motion/shotcraft/upstream/references/guided-free-creation.md +199 -199
  197. package/lib/motion/shotcraft/upstream/references/jianying-export.md +183 -183
  198. package/lib/motion/shotcraft/upstream/references/music-beat-sync.md +257 -257
  199. package/lib/motion/shotcraft/upstream/references/pipeline.md +382 -382
  200. package/lib/motion/shotcraft/upstream/references/publish-upload-post.md +111 -111
  201. package/lib/motion/shotcraft/upstream/references/sequences/promo-energy-arc.md +50 -50
  202. package/lib/motion/shotcraft/upstream/references/sfx-sourcing.md +95 -95
  203. package/lib/motion/shotcraft/upstream/references/shots/camera/basic-3d-scene.md +41 -41
  204. package/lib/motion/shotcraft/upstream/references/shots/camera/crash-zoom-punch.md +52 -52
  205. package/lib/motion/shotcraft/upstream/references/shots/camera/cursor-flyover.md +39 -39
  206. package/lib/motion/shotcraft/upstream/references/shots/camera/depth-layer-moves.md +39 -39
  207. package/lib/motion/shotcraft/upstream/references/shots/camera/graze-face-tour.md +57 -57
  208. package/lib/motion/shotcraft/upstream/references/shots/camera/overhead-camera-moves.md +51 -51
  209. package/lib/motion/shotcraft/upstream/references/shots/camera/space-camera-moves.md +46 -46
  210. package/lib/motion/shotcraft/upstream/references/shots/camera/steep-tilt-glide.md +52 -52
  211. package/lib/motion/shotcraft/upstream/references/shots/camera/tension-camera-moves.md +43 -43
  212. package/lib/motion/shotcraft/upstream/references/shots/camera/terminal-3d.md +42 -42
  213. package/lib/motion/shotcraft/upstream/references/shots/data/before-after-slider-scrub.md +48 -48
  214. package/lib/motion/shotcraft/upstream/references/shots/data/chart-live-moves.md +52 -52
  215. package/lib/motion/shotcraft/upstream/references/shots/data/gauge-readout-moves.md +45 -45
  216. package/lib/motion/shotcraft/upstream/references/shots/data/scroll-brake-moves.md +46 -46
  217. package/lib/motion/shotcraft/upstream/references/shots/data/timeline-travel.md +44 -44
  218. package/lib/motion/shotcraft/upstream/references/shots/effects/assemble-then-type-flyin.md +63 -63
  219. package/lib/motion/shotcraft/upstream/references/shots/effects/aurora-bloom-bg-flip.md +54 -54
  220. package/lib/motion/shotcraft/upstream/references/shots/effects/brand-frame-snap.md +58 -58
  221. package/lib/motion/shotcraft/upstream/references/shots/effects/fui-hud-moves.md +35 -35
  222. package/lib/motion/shotcraft/upstream/references/shots/effects/glow-flyline-moves.md +53 -53
  223. package/lib/motion/shotcraft/upstream/references/shots/effects/icon-performance-moves.md +42 -42
  224. package/lib/motion/shotcraft/upstream/references/shots/effects/impact-feedback.md +50 -50
  225. package/lib/motion/shotcraft/upstream/references/shots/effects/light-play-moves.md +46 -46
  226. package/lib/motion/shotcraft/upstream/references/shots/effects/radial-ripple-phone-chips.md +56 -56
  227. package/lib/motion/shotcraft/upstream/references/shots/effects/riso-print-hits.md +49 -49
  228. package/lib/motion/shotcraft/upstream/references/shots/effects/scan-bracket-sweep.md +50 -50
  229. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-annotate-focus.md +53 -53
  230. package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-assemble-flyin.md +53 -53
  231. package/lib/motion/shotcraft/upstream/references/shots/effects/slam-entrance-moves.md +55 -55
  232. package/lib/motion/shotcraft/upstream/references/shots/effects/spotlight-sweep-moves.md +52 -52
  233. package/lib/motion/shotcraft/upstream/references/shots/interaction/autolayout-gap-dial.md +60 -60
  234. package/lib/motion/shotcraft/upstream/references/shots/interaction/canvas-materialize-moves.md +57 -57
  235. package/lib/motion/shotcraft/upstream/references/shots/interaction/chip-grid-single-select-blackout.md +51 -51
  236. package/lib/motion/shotcraft/upstream/references/shots/interaction/collab-cursor-moves.md +41 -41
  237. package/lib/motion/shotcraft/upstream/references/shots/interaction/glass-pill-dictation-typing.md +53 -53
  238. package/lib/motion/shotcraft/upstream/references/shots/interaction/hashtag-to-pill-materialize.md +60 -60
  239. package/lib/motion/shotcraft/upstream/references/shots/interaction/picker-carousel-feature-cycle.md +55 -55
  240. package/lib/motion/shotcraft/upstream/references/shots/interaction/segmented-thumb-hero.md +57 -57
  241. package/lib/motion/shotcraft/upstream/references/shots/interaction/theme-switch-moves.md +47 -47
  242. package/lib/motion/shotcraft/upstream/references/shots/interaction/type-and-filter.md +37 -37
  243. package/lib/motion/shotcraft/upstream/references/shots/interaction/voice-waveform-live.md +54 -54
  244. package/lib/motion/shotcraft/upstream/references/shots/opening/brand-ink-open.md +36 -36
  245. package/lib/motion/shotcraft/upstream/references/shots/opening/crane-rise-reveal.md +56 -56
  246. package/lib/motion/shotcraft/upstream/references/shots/opening/dataviz-landscape-open.md +56 -56
  247. package/lib/motion/shotcraft/upstream/references/shots/opening/fracture.md +40 -40
  248. package/lib/motion/shotcraft/upstream/references/shots/opening/icon-field-colorize.md +60 -60
  249. package/lib/motion/shotcraft/upstream/references/shots/opening/letterspace-materialize.md +57 -57
  250. package/lib/motion/shotcraft/upstream/references/shots/opening/magician-card-flourish.md +73 -73
  251. package/lib/motion/shotcraft/upstream/references/shots/opening/orbit-ring-title-open.md +87 -87
  252. package/lib/motion/shotcraft/upstream/references/shots/opening/spotlight-hero-card.md +55 -55
  253. package/lib/motion/shotcraft/upstream/references/shots/opening/stroke-segment-build.md +50 -50
  254. package/lib/motion/shotcraft/upstream/references/shots/opening/text-as-mask.md +59 -59
  255. package/lib/motion/shotcraft/upstream/references/shots/outro/grain-dissolve.md +38 -38
  256. package/lib/motion/shotcraft/upstream/references/shots/outro/logo-shrink-wordmark-lockup.md +38 -38
  257. package/lib/motion/shotcraft/upstream/references/shots/outro/neon-triple-marquee.md +59 -59
  258. package/lib/motion/shotcraft/upstream/references/shots/outro/outro-group-photo-launch.md +39 -39
  259. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-strip-away-outro.md +61 -61
  260. package/lib/motion/shotcraft/upstream/references/shots/outro/ui-to-brand-morph.md +52 -52
  261. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-cut-moves.md +50 -50
  262. package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-step-list-theme-cycle.md +66 -66
  263. package/lib/motion/shotcraft/upstream/references/shots/rhythm/panel-grid-moves.md +43 -43
  264. package/lib/motion/shotcraft/upstream/references/shots/rhythm/quad-split-parallel-scenes.md +38 -38
  265. package/lib/motion/shotcraft/upstream/references/shots/rhythm/rhythm-interrupt-moves.md +38 -38
  266. package/lib/motion/shotcraft/upstream/references/shots/rhythm/sakuga-timing-shift.md +56 -56
  267. package/lib/motion/shotcraft/upstream/references/shots/rhythm/speed-ramp-freeze.md +44 -44
  268. package/lib/motion/shotcraft/upstream/references/shots/rhythm/trailer-grammar-moves.md +38 -38
  269. package/lib/motion/shotcraft/upstream/references/shots/transition/bottom-push-stack-wipe.md +63 -63
  270. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flip-reveal.md +57 -57
  271. package/lib/motion/shotcraft/upstream/references/shots/transition/card-flock-tumble.md +63 -63
  272. package/lib/motion/shotcraft/upstream/references/shots/transition/circle-match-iris.md +58 -58
  273. package/lib/motion/shotcraft/upstream/references/shots/transition/gradient-transition.md +45 -45
  274. package/lib/motion/shotcraft/upstream/references/shots/transition/line-carry-transition.md +55 -55
  275. package/lib/motion/shotcraft/upstream/references/shots/transition/mosaic-reframe.md +49 -49
  276. package/lib/motion/shotcraft/upstream/references/shots/transition/page-turn-transitions.md +42 -42
  277. package/lib/motion/shotcraft/upstream/references/shots/transition/print-texture-transitions.md +42 -42
  278. package/lib/motion/shotcraft/upstream/references/shots/transition/shot-transitions.md +45 -45
  279. package/lib/motion/shotcraft/upstream/references/shots/transition/tear-streak-transitions.md +48 -48
  280. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-hidden-cut.md +55 -55
  281. package/lib/motion/shotcraft/upstream/references/shots/transition/transition-travel.md +43 -43
  282. package/lib/motion/shotcraft/upstream/references/shots/transition/white-flash-logo-simplify-cut.md +41 -41
  283. package/lib/motion/shotcraft/upstream/references/shots/transition/wipe-transitions.md +42 -42
  284. package/lib/motion/shotcraft/upstream/references/shots/typography/blur-slide.md +59 -59
  285. package/lib/motion/shotcraft/upstream/references/shots/typography/brace-expand.md +55 -55
  286. package/lib/motion/shotcraft/upstream/references/shots/typography/countdown-arc-scatter.md +65 -65
  287. package/lib/motion/shotcraft/upstream/references/shots/typography/document-typewriter-reveal.md +42 -42
  288. package/lib/motion/shotcraft/upstream/references/shots/typography/flying-words.md +64 -64
  289. package/lib/motion/shotcraft/upstream/references/shots/typography/glitch-cycle.md +64 -64
  290. package/lib/motion/shotcraft/upstream/references/shots/typography/gradient-word-sweep.md +54 -54
  291. package/lib/motion/shotcraft/upstream/references/shots/typography/lead-word-zoom-assemble.md +91 -91
  292. package/lib/motion/shotcraft/upstream/references/shots/typography/marker-underline-title.md +51 -51
  293. package/lib/motion/shotcraft/upstream/references/shots/typography/outline-word-fill.md +66 -66
  294. package/lib/motion/shotcraft/upstream/references/shots/typography/paper-title-card.md +38 -38
  295. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-chip-slot-cycle-handled.md +66 -66
  296. package/lib/motion/shotcraft/upstream/references/shots/typography/pill-slot-cycle.md +58 -58
  297. package/lib/motion/shotcraft/upstream/references/shots/typography/text-column-converge.md +61 -61
  298. package/lib/motion/shotcraft/upstream/references/shots/typography/title-demote-to-label.md +64 -64
  299. package/lib/motion/shotcraft/upstream/references/shots/typography/type-assembly-moves.md +45 -45
  300. package/lib/motion/shotcraft/upstream/references/shots/typography/type-entrance-moves.md +41 -41
  301. package/lib/motion/shotcraft/upstream/references/shots/typography/type-rhythm-sync.md +51 -51
  302. package/lib/motion/shotcraft/upstream/references/shots/typography/typewriter-moves.md +42 -42
  303. package/lib/motion/shotcraft/upstream/references/shots/typography/vertical-word-roll-blur-cycle.md +63 -63
  304. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-filmstrip.md +57 -57
  305. package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-geometry.md +75 -75
  306. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/avatar-bracket-carousel.md +59 -59
  307. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/bezier-source-converge-merge.md +67 -67
  308. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/card-stack.md +60 -60
  309. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/carousel-3d.md +66 -66
  310. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/cloner-depth-echo.md +40 -40
  311. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/deck-deal-flyin.md +45 -45
  312. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/doc-park-left-pill-deal.md +62 -62
  313. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/draw-svg-trace.md +55 -55
  314. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/element-body-moves.md +37 -37
  315. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/integration-hub-map.md +55 -55
  316. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-reveal.md +50 -50
  317. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-stack-press.md +43 -43
  318. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-forerun.md +55 -55
  319. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-orbit-drop.md +51 -51
  320. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/page-waterfall-wall.md +51 -51
  321. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/product-card-progressive-assemble.md +56 -56
  322. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/radial-wave.md +49 -49
  323. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/research-card-stack-scroll.md +57 -57
  324. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/row-embed.md +36 -36
  325. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/value-stagger-gradient.md +64 -64
  326. package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/wall-reveal-moves.md +47 -47
  327. package/lib/motion/shotcraft/upstream/references/sound-design.md +170 -170
  328. package/lib/motion/shotcraft/upstream/references/workbench.md +157 -157
  329. package/lib/motion/shotcraft/upstream/template/TEMPLATE.md +103 -103
  330. package/lib/motion/shotcraft/upstream/template/THEMES.md +44 -44
  331. package/lib/motion/shotcraft/upstream/template/package.json +20 -20
  332. package/lib/motion/shotcraft/upstream/template/remotion.config.ts +6 -6
  333. package/lib/motion/shotcraft/upstream/template/src/Root.tsx +17 -17
  334. package/lib/motion/shotcraft/upstream/template/src/aifl/Caption.tsx +65 -65
  335. package/lib/motion/shotcraft/upstream/template/src/aifl/DigitRoll.tsx +48 -48
  336. package/lib/motion/shotcraft/upstream/template/src/aifl/FlashCut.tsx +24 -24
  337. package/lib/motion/shotcraft/upstream/template/src/aifl/Main.tsx +192 -192
  338. package/lib/motion/shotcraft/upstream/template/src/aifl/PaperTitleCard.tsx +111 -111
  339. package/lib/motion/shotcraft/upstream/template/src/aifl/live/PageCam.tsx +150 -150
  340. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneDetail.tsx +158 -158
  341. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneFlyIn.tsx +468 -468
  342. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOpen.tsx +552 -552
  343. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOutroLive.tsx +411 -411
  344. package/lib/motion/shotcraft/upstream/template/src/aifl/live/ScenePapers.tsx +200 -200
  345. package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneWbr.tsx +324 -324
  346. package/lib/motion/shotcraft/upstream/template/src/aifl/live-layout.json +388 -388
  347. package/lib/motion/shotcraft/upstream/template/src/index.ts +4 -4
  348. package/lib/motion/shotcraft/upstream/template/src/themes/ThemedFilm.tsx +7 -7
  349. package/lib/motion/shotcraft/upstream/template/src/themes/manifest.tsx +68 -68
  350. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.json +1 -1
  351. package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.ts +24 -24
  352. package/lib/motion/shotcraft/upstream/template/src/themes/palettes.json +74 -74
  353. package/lib/motion/shotcraft/upstream/template/src/themes/visual-theme.tsx +91 -91
  354. package/lib/motion/shotcraft/upstream/template/src/workbench.ts +213 -213
  355. package/lib/motion/shotcraft/upstream/template/tsconfig.json +15 -15
  356. package/lib/motion/style-frames.js +306 -306
  357. package/lib/motion/sync.js +214 -214
  358. package/lib/motion-project.js +105 -105
  359. package/lib/motion-render-worker.js +174 -174
  360. package/lib/routing/router.js +222 -222
  361. package/lib/routing/vendor/README.md +96 -96
  362. package/lib/routing/vendor/libavoid-routing.js +753 -753
  363. package/lib/routing/vendor/libavoid.min.js +59 -59
  364. package/lib/video-trace-pool.js +128 -128
  365. package/package.json +1 -1
  366. 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
+ };