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,290 +1,290 @@
1
- // oscilloscope-stream-v2 —— 示波流线:曲线写入点钉在右侧上下起伏,旧数据向左流出画;
2
- // 中途一次突发尖峰(振幅 2.2×,读数跳大变强调色),最后刹停真静止。
3
- //
4
- // 第二轮重设计(深蓝夜 · 满版示波监控墙):
5
- // - look = midnight(深蓝夜 · 电光蓝),事件色单独给一抹珊瑚红(只给尖峰)。不再是"卡片里的小图":
6
- // 整个画面就是一块示波器屏——1728×520 的满版绘图区,示波器式刻度网(主格实线 + 次格点阵 + 中心十字刻度),
7
- // 电光蓝磷光迹线(实线 + 两层泛光),写入头在 86% 处:竖向扫描线 + 光斑 + 一条横向读数参考线。
8
- // - 文字层级:左上 video-shotcraft 标志 + 字标眉题(渲染农场 · 帧/秒)+ LIVE 灯、168px 实时读数(每 3 帧采样保持,像真的仪表);
9
- // 右上 p99 延迟 / 错误率两枚副读数,跟着尖峰一起跳。
10
- // - 尖峰事件:写入头经过时迹线该段整段变珊瑚红并加粗,大读数放大 + 变珊瑚红,p99 跳到 3 位数;
11
- // 写完后峰顶钉一枚「Burst」事件标签 + 竖向落线,随流向左带走。
12
- // - 刹停:流速 out-cubic 刹车(初速与流速相同,无速度跳变),LIVE → PAUSED,写入头光斑熄灭;
13
- // 之后相机缓推 3% 对准尖峰(有明确目标与落点),真静止 hold。
14
- //
15
- // 时间表(30fps,共 165f):
16
- // 0–16 屏幕点亮:刻度网从中心展开、迹线已在流动(直播感,第 1 帧即有内容)、读数/眉题浮入
17
- // 0–104 匀速流动 8px/f(采样窗平移是机械语义,刻意匀速)
18
- // 46–68 尖峰写入(读数/副读数随包络跳变);~70f 事件标签 overshoot 弹出
19
- // 104–118 刹停 14f(out-cubic)
20
- // 118–165 hold 47f:相机 1 → 1.03 缓推向尖峰(smooth),其余静止
21
- import React from 'react';
22
- import { AbsoluteFill, useCurrentFrame } from 'remotion';
23
- import { EASE, FONT, mix, ramp } from '../../_fixtures/Polish';
24
- import { LOOKS, Stage, alpha, type } from '../../_fixtures/Look';
25
- import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
26
-
27
- export const OSCILLOSCOPE_STREAM_V2_DURATION = 165;
28
-
29
- const L = LOOKS.midnight;
30
- const TRACE = L.accent; // 电光蓝
31
- const HOT = '#ff6b5b'; // 事件色:珊瑚红(只给尖峰)
32
-
33
- // 绘图区
34
- const PX = 96;
35
- const PW = 1728;
36
- const PY = 404;
37
- const PH = 520;
38
- const HEAD = Math.round(PW * 0.86); // 写入头位置(绘图区内 x)
39
-
40
- const SPEED = 8;
41
- const FREEZE0 = 104;
42
- const FREEZE1 = 118;
43
- const OFFSET = 1400; // 世界坐标偏移:第 0 帧时窗口里已有完整历史
44
-
45
- // 有效时间(世界 x):匀速,FREEZE 段 out-cubic 刹停;刹车距离 = SPEED×dur/3(初速连续)
46
- const worldAt = (f: number) => {
47
- if (f <= FREEZE0) return OFFSET + f * SPEED;
48
- const brake = (SPEED * (FREEZE1 - FREEZE0)) / 3;
49
- return OFFSET + FREEZE0 * SPEED + brake * ramp(f, FREEZE0, FREEZE1 - FREEZE0, (x) => 1 - Math.pow(1 - x, 3));
50
- };
51
-
52
- // 尖峰:写入头在 f46 起经过 worldX [S0, S0+SW];主峰是一记尖锐的高斯脉冲(+2.2× 常态振幅),
53
- // 前后各带一个小的前兆 / 余震,峰段内原波形抖动加倍
54
- const S0 = OFFSET + 46 * SPEED;
55
- const SW = 176;
56
- const SC = S0 + SW * 0.5;
57
- const gauss = (x: number, c: number, w: number) => Math.exp(-Math.pow((x - c) / w, 2));
58
- const bump = (x: number) => 2.2 * gauss(x, SC, 26) + 0.45 * gauss(x, SC - 62, 18) + 0.6 * gauss(x, SC + 48, 20);
59
- const burstK = (x: number) => Math.min(1, bump(x) / 2.2);
60
- const wave = (x: number) =>
61
- 0.34 * Math.sin(x * 0.019) + 0.27 * Math.sin(x * 0.047 + 1.7) + 0.18 * Math.sin(x * 0.011 + 4.2) + 0.11 * Math.sin(x * 0.083 + 2.3);
62
- const inSpike = (x: number) => gauss(x, SC, SW * 0.45);
63
- const signal = (x: number) => wave(x) * (1 + 0.6 * inSpike(x)) + bump(x);
64
- const valueOf = (x: number) => 1350 + signal(x) * 560; // fps(渲染帧 / 秒)
65
- const MAXV = 3000;
66
- const yOf = (x: number) => PH - (valueOf(x) / MAXV) * PH;
67
-
68
- const PEAK_X = (() => {
69
- let best = S0;
70
- for (let x = S0; x <= S0 + SW; x += 0.5) if (signal(x) > signal(best)) best = x;
71
- return best;
72
- })();
73
-
74
- const fmt = (n: number) => Math.round(n).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
75
- const hexMix = (a: string, b: string, t: number) => {
76
- const p = (h: string) => [1, 3, 5].map((i) => parseInt(h.slice(i, i + 2), 16));
77
- const A = p(a);
78
- const B = p(b);
79
- return `rgb(${A.map((v, i) => Math.round(v + (B[i] - v) * t)).join(',')})`;
80
- };
81
-
82
- export const OscilloscopeStreamV2: React.FC = () => {
83
- const frame = useCurrentFrame();
84
- const T = worldAt(frame); // 写入头的世界 x
85
- const worldOf = (px: number) => T - (HEAD - px);
86
-
87
- // 迹线采样(写入头以左)
88
- const STEP = 4;
89
- const pts: Array<[number, number, number]> = [];
90
- for (let px = 0; px <= HEAD; px += STEP) pts.push([px, yOf(worldOf(px)), worldOf(px)]);
91
- if (pts[pts.length - 1][0] !== HEAD) pts.push([HEAD, yOf(T), T]);
92
- const toD = (a: Array<[number, number, number]>) => a.map(([x, y], i) => `${i ? 'L' : 'M'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ');
93
- const lineD = toD(pts);
94
- const areaD = `${lineD} L${HEAD},${PH} L0,${PH} Z`;
95
- const spike = pts.filter(([, , w]) => w >= S0 + 10 && w <= Math.min(T, S0 + SW - 10));
96
- const spikeD = spike.length > 1 ? toD(spike) : '';
97
- const headY = yOf(T);
98
- const freshD = toD(pts.filter(([x]) => x >= HEAD - 284));
99
-
100
- // 读数:每 3 帧采样保持(真仪表的刷新感);尖峰包络驱动放大 + 变色
101
- const held = worldAt(Math.floor(frame / 3) * 3);
102
- // 读数热度:写入头附近 ±40px 的尖峰强度(峰前两帧就开始升温,峰后缓降)
103
- const spikeK = Math.max(burstK(T), 0.8 * burstK(T - 30), 0.5 * burstK(T - 60));
104
- const hot = EASE.out(Math.min(1, spikeK * 1.6));
105
- const readScale = 1 + 0.08 * spikeK;
106
- const p99 = Math.round(42 + 84 * spikeK + 2 * Math.sin(frame / 5));
107
- const errRate = (0.02 + 0.12 * spikeK).toFixed(2);
108
-
109
- const live = 1 - ramp(frame, FREEZE0, FREEZE1 - FREEZE0, EASE.out);
110
- const pulse = 0.5 + 0.5 * Math.cos((frame / 24) * Math.PI * 2);
111
-
112
- // 事件标签:写入头越过峰顶后弹出,钉在峰顶随流向左
113
- const peakPx = HEAD - (T - PEAK_X);
114
- const peakY = yOf(PEAK_X);
115
- const passF = (PEAK_X - OFFSET) / SPEED;
116
- const tagIn = ramp(frame, passF + 3, 14, EASE.overshoot);
117
-
118
- // 屏幕点亮
119
- const on = ramp(frame, 0, 16, EASE.snappy);
120
- const headIn = ramp(frame, 2, 16, EASE.out);
121
-
122
- // 刹停后缓推向尖峰
123
- const push = ramp(frame, FREEZE1 - 4, 165 - FREEZE1 + 4, EASE.smooth);
124
- const cam = mix(1, 1.025, push);
125
- const camOX = PX + mix(HEAD, peakPx, 0.6);
126
- const camOY = PY + PH * 0.45;
127
-
128
- const gridV = 12;
129
- const gridH = 6;
130
-
131
- return (
132
- <AbsoluteFill style={{ background: L.bg[1], overflow: 'hidden' }}>
133
- <Stage look={L} keyLight={{ x: 0.62, y: 0.55 }} fill={{ x: 0.08, y: 0.1 }} intensity={0.8} breathe={0.4} />
134
-
135
- <div style={{ position: 'absolute', inset: 0, transform: `scale(${cam.toFixed(5)})`, transformOrigin: `${camOX}px ${camOY}px` }}>
136
- {/* 眉题 + LIVE */}
137
- <div style={{ position: 'absolute', left: PX, top: 92, display: 'flex', alignItems: 'center', gap: 22, opacity: headIn }}>
138
- <span style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
139
- <ShotcraftMark size={40} tone="dark" />
140
- <span style={{ ...type(32, 700), fontFamily: BRAND.font, letterSpacing: '0.03em', color: L.ink }}>{BRAND.name}</span>
141
- </span>
142
- <span style={{ ...type(32, 500, { caps: true }), color: L.ink3 }}>render-farm · prod · fps</span>
143
- <span style={{
144
- display: 'flex', alignItems: 'center', gap: 10, padding: '6px 16px 6px 12px', borderRadius: 99,
145
- background: live > 0.5 ? alpha(L.accent2, 0.12) : alpha('#ffffff', 0.06),
146
- border: `1px solid ${live > 0.5 ? alpha(L.accent2, 0.35) : alpha('#ffffff', 0.12)}`,
147
- ...type(26, 750, { caps: true }), color: live > 0.5 ? L.accent2 : L.ink3,
148
- }}>
149
- <span style={{
150
- width: 12, height: 12, borderRadius: 6, background: live > 0.5 ? L.accent2 : L.ink3,
151
- boxShadow: live > 0.5 ? `0 0 0 ${(3 + 5 * pulse).toFixed(1)}px ${alpha(L.accent2, 0.25 * (1 - pulse))}` : 'none',
152
- }} />
153
- {live > 0.5 ? 'Live' : 'Paused'}
154
- </span>
155
- </div>
156
-
157
- {/* 大读数 */}
158
- <div style={{
159
- position: 'absolute', left: PX - 8, top: 140, display: 'flex', alignItems: 'baseline', gap: 22,
160
- transform: `scale(${readScale.toFixed(4)})`, transformOrigin: 'left bottom', opacity: headIn,
161
- }}>
162
- <span style={{
163
- ...type(176, 700), color: hexMix('#f2f5ff', HOT, hot),
164
- textShadow: hot > 0.02 ? `0 0 40px ${alpha(HOT, 0.35 * hot)}` : undefined,
165
- }}>{fmt(valueOf(held))}</span>
166
- <span style={{ ...type(48, 500), color: hexMix('#a9b4d0', HOT, hot) }}>fps</span>
167
- </div>
168
-
169
- {/* 右上副读数 */}
170
- <div style={{ position: 'absolute', right: 1920 - PX - PW, top: 150, display: 'flex', gap: 72, opacity: ramp(frame, 6, 14, EASE.out) }}>
171
- {[
172
- { k: 'p99 frame time', v: `${p99}`, u: 'ms', hotK: hot },
173
- { k: 'Failed jobs', v: errRate, u: '%', hotK: hot * 0.8 },
174
- ].map((s) => (
175
- <div key={s.k} style={{ textAlign: 'right' }}>
176
- <div style={{ ...type(32, 500), color: L.ink3 }}>{s.k}</div>
177
- <div style={{ marginTop: 8 }}>
178
- <span style={{ ...type(84, 650), color: hexMix('#f2f5ff', HOT, s.hotK) }}>{s.v}</span>
179
- <span style={{ ...type(36, 500), color: L.ink2, marginLeft: 8 }}>{s.u}</span>
180
- </div>
181
- </div>
182
- ))}
183
- </div>
184
-
185
- {/* 示波屏 */}
186
- <div style={{ position: 'absolute', left: PX, top: PY, width: PW, height: PH }}>
187
- <svg width={PW} height={PH + 80} style={{ position: 'absolute', left: 0, top: 0, overflow: 'visible' }}>
188
- <defs>
189
- <linearGradient id="osArea" x1="0" y1="0" x2="0" y2={PH} gradientUnits="userSpaceOnUse">
190
- <stop offset="0" stopColor={TRACE} stopOpacity={0.3} />
191
- <stop offset="1" stopColor={TRACE} stopOpacity={0} />
192
- </linearGradient>
193
- <linearGradient id="osFade" x1="0" y1="0" x2={PW} y2="0" gradientUnits="userSpaceOnUse">
194
- <stop offset="0" stopColor="#fff" stopOpacity={0} />
195
- <stop offset="0.14" stopColor="#fff" stopOpacity={1} />
196
- <stop offset="1" stopColor="#fff" stopOpacity={1} />
197
- </linearGradient>
198
- <mask id="osMask" maskUnits="userSpaceOnUse" x={-20} y={-200} width={PW + 40} height={PH + 300}>
199
- <rect x={-20} y={-200} width={PW + 40} height={PH + 300} fill="url(#osFade)" />
200
- </mask>
201
- <filter id="osGlowA" x="-10%" y="-30%" width="120%" height="160%"><feGaussianBlur stdDeviation="5" /></filter>
202
- <filter id="osGlowB" x="-10%" y="-40%" width="120%" height="180%"><feGaussianBlur stdDeviation="16" /></filter>
203
- <radialGradient id="osHead">
204
- <stop offset="0" stopColor="#ffffff" stopOpacity={1} />
205
- <stop offset="0.25" stopColor={hexMix('#5b8cff', HOT, hot)} stopOpacity={0.8} />
206
- <stop offset="1" stopColor={hexMix('#5b8cff', HOT, hot)} stopOpacity={0} />
207
- </radialGradient>
208
- <linearGradient id="osFresh" x1={HEAD - 280} y1="0" x2={HEAD} y2="0" gradientUnits="userSpaceOnUse">
209
- <stop offset="0" stopColor="#ffffff" stopOpacity={0} />
210
- <stop offset="1" stopColor="#ffffff" stopOpacity={0.95} />
211
- </linearGradient>
212
- </defs>
213
-
214
- {/* 刻度网:主格线 + 次格点阵 + 中心十字刻度;从中心展开 */}
215
- <g opacity={on}>
216
- {Array.from({ length: gridV + 1 }, (_, i) => {
217
- const x = (i / gridV) * PW;
218
- const reach = (PH / 2) * on;
219
- return <line key={`v${i}`} x1={x} x2={x} y1={PH / 2 - reach} y2={PH / 2 + reach} stroke={L.accent} strokeOpacity={i === 0 || i === gridV ? 0.22 : 0.1} strokeWidth={1.2} />;
220
- })}
221
- {Array.from({ length: gridH + 1 }, (_, i) => {
222
- const y = (i / gridH) * PH;
223
- const reach = (PW / 2) * on;
224
- return <line key={`h${i}`} x1={PW / 2 - reach} x2={PW / 2 + reach} y1={y} y2={y} stroke={L.accent} strokeOpacity={i === 0 || i === gridH ? 0.22 : 0.1} strokeWidth={1.2} />;
225
- })}
226
- {Array.from({ length: gridV * 5 + 1 }, (_, i) => (
227
- <line key={`tk${i}`} x1={(i / (gridV * 5)) * PW} x2={(i / (gridV * 5)) * PW} y1={PH / 2 - (i % 5 ? 5 : 10)} y2={PH / 2 + (i % 5 ? 5 : 10)} stroke={L.accent} strokeOpacity={0.28} strokeWidth={1.2} />
228
- ))}
229
- </g>
230
-
231
- {/* 迹线:面积 + 两层泛光 + 实线(左端渐隐出画) */}
232
- <g mask="url(#osMask)">
233
- <path d={areaD} fill="url(#osArea)" />
234
- <path d={lineD} fill="none" stroke={TRACE} strokeWidth={10} opacity={0.5} filter="url(#osGlowB)" />
235
- <path d={lineD} fill="none" stroke={TRACE} strokeWidth={5} opacity={0.75} filter="url(#osGlowA)" />
236
- <path d={lineD} fill="none" stroke="#cfdcff" strokeWidth={3.5} strokeLinejoin="round" strokeLinecap="round" />
237
- {/* 最新 280px:磷光最亮的"新鲜"段 */}
238
- <path d={freshD} fill="none" stroke="url(#osFresh)" strokeWidth={4.5} strokeLinejoin="round" strokeLinecap="round" opacity={0.4 + 0.6 * live} />
239
- {spikeD && (
240
- <>
241
- <path d={spikeD} fill="none" stroke={HOT} strokeWidth={14} opacity={0.55} filter="url(#osGlowB)" />
242
- <path d={spikeD} fill="none" stroke={HOT} strokeWidth={5} strokeLinejoin="round" strokeLinecap="round" />
243
- </>
244
- )}
245
- </g>
246
-
247
- {/* 写入头:竖向扫描线 + 横向读数参考线 + 光斑 */}
248
- <line x1={HEAD} x2={HEAD} y1={0} y2={PH} stroke={hexMix('#5b8cff', HOT, hot)} strokeOpacity={0.45 * live + 0.12} strokeWidth={1.5} />
249
- <line x1={HEAD} x2={PW} y1={headY} y2={headY} stroke={hexMix('#cfdcff', HOT, hot)} strokeOpacity={0.4} strokeWidth={1.5} strokeDasharray="4 6" />
250
- <circle cx={HEAD} cy={headY} r={70} fill="url(#osHead)" opacity={0.55 * live} />
251
- <circle cx={HEAD} cy={headY} r={9} fill={hexMix('#ffffff', HOT, hot * 0.6)} stroke={L.bg[1]} strokeWidth={3} />
252
-
253
- {/* 事件:峰顶标记 + 竖向落线 */}
254
- {tagIn > 0 && peakPx > 40 && (
255
- <g opacity={Math.min(1, tagIn * 1.5)}>
256
- <line x1={peakPx} x2={peakPx} y1={peakY + 14} y2={PH} stroke={HOT} strokeOpacity={0.5} strokeWidth={1.5} strokeDasharray="3 5" />
257
- <circle cx={peakPx} cy={peakY} r={9 * tagIn} fill={HOT} stroke={L.bg[1]} strokeWidth={3} />
258
- </g>
259
- )}
260
-
261
- {/* 时间轴 */}
262
- {['−50s', '−40s', '−30s', '−20s', '−10s', 'now'].map((t, i) => (
263
- <text key={t} x={(HEAD * (i + 1)) / 6} y={PH + 52} textAnchor="middle" fill={i === 5 ? L.ink2 : L.ink3}
264
- style={{ ...type(32, 500), fontFamily: FONT.sans }} opacity={headIn}>{t}</text>
265
- ))}
266
- </svg>
267
-
268
- {/* y 轴刻度(屏内左上,压在主格线上方) */}
269
- {['3k', '2k', '1k'].map((t, i) => (
270
- <div key={t} style={{ position: 'absolute', left: 14, top: (i * 2 * PH) / 6 + 8, ...type(28, 600), color: L.ink3, opacity: on }}>{t}</div>
271
- ))}
272
-
273
- {/* 事件标签 */}
274
- {tagIn > 0 && peakPx > 40 && (
275
- <div style={{
276
- position: 'absolute', left: peakPx + 22, top: peakY - 36, height: 72, padding: '0 26px 0 20px',
277
- display: 'flex', alignItems: 'center', gap: 14, borderRadius: 14, whiteSpace: 'nowrap',
278
- background: `linear-gradient(180deg, ${alpha(HOT, 0.22)}, ${alpha(HOT, 0.12)})`, border: `1px solid ${alpha(HOT, 0.55)}`,
279
- boxShadow: `0 16px 40px -10px ${alpha('#000000', 0.6)}`,
280
- transform: `scale(${tagIn.toFixed(4)})`, transformOrigin: '0% 50%', opacity: Math.min(1, tagIn * 1.5),
281
- }}>
282
- <span style={{ ...type(32, 800, { caps: true }), color: HOT }}>Burst</span>
283
- <span style={{ ...type(32, 600), color: '#ffe3de' }}>{fmt(valueOf(PEAK_X))} fps</span>
284
- </div>
285
- )}
286
- </div>
287
- </div>
288
- </AbsoluteFill>
289
- );
290
- };
1
+ // oscilloscope-stream-v2 —— 示波流线:曲线写入点钉在右侧上下起伏,旧数据向左流出画;
2
+ // 中途一次突发尖峰(振幅 2.2×,读数跳大变强调色),最后刹停真静止。
3
+ //
4
+ // 第二轮重设计(深蓝夜 · 满版示波监控墙):
5
+ // - look = midnight(深蓝夜 · 电光蓝),事件色单独给一抹珊瑚红(只给尖峰)。不再是"卡片里的小图":
6
+ // 整个画面就是一块示波器屏——1728×520 的满版绘图区,示波器式刻度网(主格实线 + 次格点阵 + 中心十字刻度),
7
+ // 电光蓝磷光迹线(实线 + 两层泛光),写入头在 86% 处:竖向扫描线 + 光斑 + 一条横向读数参考线。
8
+ // - 文字层级:左上 video-shotcraft 标志 + 字标眉题(渲染农场 · 帧/秒)+ LIVE 灯、168px 实时读数(每 3 帧采样保持,像真的仪表);
9
+ // 右上 p99 延迟 / 错误率两枚副读数,跟着尖峰一起跳。
10
+ // - 尖峰事件:写入头经过时迹线该段整段变珊瑚红并加粗,大读数放大 + 变珊瑚红,p99 跳到 3 位数;
11
+ // 写完后峰顶钉一枚「Burst」事件标签 + 竖向落线,随流向左带走。
12
+ // - 刹停:流速 out-cubic 刹车(初速与流速相同,无速度跳变),LIVE → PAUSED,写入头光斑熄灭;
13
+ // 之后相机缓推 3% 对准尖峰(有明确目标与落点),真静止 hold。
14
+ //
15
+ // 时间表(30fps,共 165f):
16
+ // 0–16 屏幕点亮:刻度网从中心展开、迹线已在流动(直播感,第 1 帧即有内容)、读数/眉题浮入
17
+ // 0–104 匀速流动 8px/f(采样窗平移是机械语义,刻意匀速)
18
+ // 46–68 尖峰写入(读数/副读数随包络跳变);~70f 事件标签 overshoot 弹出
19
+ // 104–118 刹停 14f(out-cubic)
20
+ // 118–165 hold 47f:相机 1 → 1.03 缓推向尖峰(smooth),其余静止
21
+ import React from 'react';
22
+ import { AbsoluteFill, useCurrentFrame } from 'remotion';
23
+ import { EASE, FONT, mix, ramp } from '../../_fixtures/Polish';
24
+ import { LOOKS, Stage, alpha, type } from '../../_fixtures/Look';
25
+ import { BRAND, ShotcraftMark } from '../../_fixtures/Brand';
26
+
27
+ export const OSCILLOSCOPE_STREAM_V2_DURATION = 165;
28
+
29
+ const L = LOOKS.midnight;
30
+ const TRACE = L.accent; // 电光蓝
31
+ const HOT = '#ff6b5b'; // 事件色:珊瑚红(只给尖峰)
32
+
33
+ // 绘图区
34
+ const PX = 96;
35
+ const PW = 1728;
36
+ const PY = 404;
37
+ const PH = 520;
38
+ const HEAD = Math.round(PW * 0.86); // 写入头位置(绘图区内 x)
39
+
40
+ const SPEED = 8;
41
+ const FREEZE0 = 104;
42
+ const FREEZE1 = 118;
43
+ const OFFSET = 1400; // 世界坐标偏移:第 0 帧时窗口里已有完整历史
44
+
45
+ // 有效时间(世界 x):匀速,FREEZE 段 out-cubic 刹停;刹车距离 = SPEED×dur/3(初速连续)
46
+ const worldAt = (f: number) => {
47
+ if (f <= FREEZE0) return OFFSET + f * SPEED;
48
+ const brake = (SPEED * (FREEZE1 - FREEZE0)) / 3;
49
+ return OFFSET + FREEZE0 * SPEED + brake * ramp(f, FREEZE0, FREEZE1 - FREEZE0, (x) => 1 - Math.pow(1 - x, 3));
50
+ };
51
+
52
+ // 尖峰:写入头在 f46 起经过 worldX [S0, S0+SW];主峰是一记尖锐的高斯脉冲(+2.2× 常态振幅),
53
+ // 前后各带一个小的前兆 / 余震,峰段内原波形抖动加倍
54
+ const S0 = OFFSET + 46 * SPEED;
55
+ const SW = 176;
56
+ const SC = S0 + SW * 0.5;
57
+ const gauss = (x: number, c: number, w: number) => Math.exp(-Math.pow((x - c) / w, 2));
58
+ const bump = (x: number) => 2.2 * gauss(x, SC, 26) + 0.45 * gauss(x, SC - 62, 18) + 0.6 * gauss(x, SC + 48, 20);
59
+ const burstK = (x: number) => Math.min(1, bump(x) / 2.2);
60
+ const wave = (x: number) =>
61
+ 0.34 * Math.sin(x * 0.019) + 0.27 * Math.sin(x * 0.047 + 1.7) + 0.18 * Math.sin(x * 0.011 + 4.2) + 0.11 * Math.sin(x * 0.083 + 2.3);
62
+ const inSpike = (x: number) => gauss(x, SC, SW * 0.45);
63
+ const signal = (x: number) => wave(x) * (1 + 0.6 * inSpike(x)) + bump(x);
64
+ const valueOf = (x: number) => 1350 + signal(x) * 560; // fps(渲染帧 / 秒)
65
+ const MAXV = 3000;
66
+ const yOf = (x: number) => PH - (valueOf(x) / MAXV) * PH;
67
+
68
+ const PEAK_X = (() => {
69
+ let best = S0;
70
+ for (let x = S0; x <= S0 + SW; x += 0.5) if (signal(x) > signal(best)) best = x;
71
+ return best;
72
+ })();
73
+
74
+ const fmt = (n: number) => Math.round(n).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
75
+ const hexMix = (a: string, b: string, t: number) => {
76
+ const p = (h: string) => [1, 3, 5].map((i) => parseInt(h.slice(i, i + 2), 16));
77
+ const A = p(a);
78
+ const B = p(b);
79
+ return `rgb(${A.map((v, i) => Math.round(v + (B[i] - v) * t)).join(',')})`;
80
+ };
81
+
82
+ export const OscilloscopeStreamV2: React.FC = () => {
83
+ const frame = useCurrentFrame();
84
+ const T = worldAt(frame); // 写入头的世界 x
85
+ const worldOf = (px: number) => T - (HEAD - px);
86
+
87
+ // 迹线采样(写入头以左)
88
+ const STEP = 4;
89
+ const pts: Array<[number, number, number]> = [];
90
+ for (let px = 0; px <= HEAD; px += STEP) pts.push([px, yOf(worldOf(px)), worldOf(px)]);
91
+ if (pts[pts.length - 1][0] !== HEAD) pts.push([HEAD, yOf(T), T]);
92
+ const toD = (a: Array<[number, number, number]>) => a.map(([x, y], i) => `${i ? 'L' : 'M'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ');
93
+ const lineD = toD(pts);
94
+ const areaD = `${lineD} L${HEAD},${PH} L0,${PH} Z`;
95
+ const spike = pts.filter(([, , w]) => w >= S0 + 10 && w <= Math.min(T, S0 + SW - 10));
96
+ const spikeD = spike.length > 1 ? toD(spike) : '';
97
+ const headY = yOf(T);
98
+ const freshD = toD(pts.filter(([x]) => x >= HEAD - 284));
99
+
100
+ // 读数:每 3 帧采样保持(真仪表的刷新感);尖峰包络驱动放大 + 变色
101
+ const held = worldAt(Math.floor(frame / 3) * 3);
102
+ // 读数热度:写入头附近 ±40px 的尖峰强度(峰前两帧就开始升温,峰后缓降)
103
+ const spikeK = Math.max(burstK(T), 0.8 * burstK(T - 30), 0.5 * burstK(T - 60));
104
+ const hot = EASE.out(Math.min(1, spikeK * 1.6));
105
+ const readScale = 1 + 0.08 * spikeK;
106
+ const p99 = Math.round(42 + 84 * spikeK + 2 * Math.sin(frame / 5));
107
+ const errRate = (0.02 + 0.12 * spikeK).toFixed(2);
108
+
109
+ const live = 1 - ramp(frame, FREEZE0, FREEZE1 - FREEZE0, EASE.out);
110
+ const pulse = 0.5 + 0.5 * Math.cos((frame / 24) * Math.PI * 2);
111
+
112
+ // 事件标签:写入头越过峰顶后弹出,钉在峰顶随流向左
113
+ const peakPx = HEAD - (T - PEAK_X);
114
+ const peakY = yOf(PEAK_X);
115
+ const passF = (PEAK_X - OFFSET) / SPEED;
116
+ const tagIn = ramp(frame, passF + 3, 14, EASE.overshoot);
117
+
118
+ // 屏幕点亮
119
+ const on = ramp(frame, 0, 16, EASE.snappy);
120
+ const headIn = ramp(frame, 2, 16, EASE.out);
121
+
122
+ // 刹停后缓推向尖峰
123
+ const push = ramp(frame, FREEZE1 - 4, 165 - FREEZE1 + 4, EASE.smooth);
124
+ const cam = mix(1, 1.025, push);
125
+ const camOX = PX + mix(HEAD, peakPx, 0.6);
126
+ const camOY = PY + PH * 0.45;
127
+
128
+ const gridV = 12;
129
+ const gridH = 6;
130
+
131
+ return (
132
+ <AbsoluteFill style={{ background: L.bg[1], overflow: 'hidden' }}>
133
+ <Stage look={L} keyLight={{ x: 0.62, y: 0.55 }} fill={{ x: 0.08, y: 0.1 }} intensity={0.8} breathe={0.4} />
134
+
135
+ <div style={{ position: 'absolute', inset: 0, transform: `scale(${cam.toFixed(5)})`, transformOrigin: `${camOX}px ${camOY}px` }}>
136
+ {/* 眉题 + LIVE */}
137
+ <div style={{ position: 'absolute', left: PX, top: 92, display: 'flex', alignItems: 'center', gap: 22, opacity: headIn }}>
138
+ <span style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
139
+ <ShotcraftMark size={40} tone="dark" />
140
+ <span style={{ ...type(32, 700), fontFamily: BRAND.font, letterSpacing: '0.03em', color: L.ink }}>{BRAND.name}</span>
141
+ </span>
142
+ <span style={{ ...type(32, 500, { caps: true }), color: L.ink3 }}>render-farm · prod · fps</span>
143
+ <span style={{
144
+ display: 'flex', alignItems: 'center', gap: 10, padding: '6px 16px 6px 12px', borderRadius: 99,
145
+ background: live > 0.5 ? alpha(L.accent2, 0.12) : alpha('#ffffff', 0.06),
146
+ border: `1px solid ${live > 0.5 ? alpha(L.accent2, 0.35) : alpha('#ffffff', 0.12)}`,
147
+ ...type(26, 750, { caps: true }), color: live > 0.5 ? L.accent2 : L.ink3,
148
+ }}>
149
+ <span style={{
150
+ width: 12, height: 12, borderRadius: 6, background: live > 0.5 ? L.accent2 : L.ink3,
151
+ boxShadow: live > 0.5 ? `0 0 0 ${(3 + 5 * pulse).toFixed(1)}px ${alpha(L.accent2, 0.25 * (1 - pulse))}` : 'none',
152
+ }} />
153
+ {live > 0.5 ? 'Live' : 'Paused'}
154
+ </span>
155
+ </div>
156
+
157
+ {/* 大读数 */}
158
+ <div style={{
159
+ position: 'absolute', left: PX - 8, top: 140, display: 'flex', alignItems: 'baseline', gap: 22,
160
+ transform: `scale(${readScale.toFixed(4)})`, transformOrigin: 'left bottom', opacity: headIn,
161
+ }}>
162
+ <span style={{
163
+ ...type(176, 700), color: hexMix('#f2f5ff', HOT, hot),
164
+ textShadow: hot > 0.02 ? `0 0 40px ${alpha(HOT, 0.35 * hot)}` : undefined,
165
+ }}>{fmt(valueOf(held))}</span>
166
+ <span style={{ ...type(48, 500), color: hexMix('#a9b4d0', HOT, hot) }}>fps</span>
167
+ </div>
168
+
169
+ {/* 右上副读数 */}
170
+ <div style={{ position: 'absolute', right: 1920 - PX - PW, top: 150, display: 'flex', gap: 72, opacity: ramp(frame, 6, 14, EASE.out) }}>
171
+ {[
172
+ { k: 'p99 frame time', v: `${p99}`, u: 'ms', hotK: hot },
173
+ { k: 'Failed jobs', v: errRate, u: '%', hotK: hot * 0.8 },
174
+ ].map((s) => (
175
+ <div key={s.k} style={{ textAlign: 'right' }}>
176
+ <div style={{ ...type(32, 500), color: L.ink3 }}>{s.k}</div>
177
+ <div style={{ marginTop: 8 }}>
178
+ <span style={{ ...type(84, 650), color: hexMix('#f2f5ff', HOT, s.hotK) }}>{s.v}</span>
179
+ <span style={{ ...type(36, 500), color: L.ink2, marginLeft: 8 }}>{s.u}</span>
180
+ </div>
181
+ </div>
182
+ ))}
183
+ </div>
184
+
185
+ {/* 示波屏 */}
186
+ <div style={{ position: 'absolute', left: PX, top: PY, width: PW, height: PH }}>
187
+ <svg width={PW} height={PH + 80} style={{ position: 'absolute', left: 0, top: 0, overflow: 'visible' }}>
188
+ <defs>
189
+ <linearGradient id="osArea" x1="0" y1="0" x2="0" y2={PH} gradientUnits="userSpaceOnUse">
190
+ <stop offset="0" stopColor={TRACE} stopOpacity={0.3} />
191
+ <stop offset="1" stopColor={TRACE} stopOpacity={0} />
192
+ </linearGradient>
193
+ <linearGradient id="osFade" x1="0" y1="0" x2={PW} y2="0" gradientUnits="userSpaceOnUse">
194
+ <stop offset="0" stopColor="#fff" stopOpacity={0} />
195
+ <stop offset="0.14" stopColor="#fff" stopOpacity={1} />
196
+ <stop offset="1" stopColor="#fff" stopOpacity={1} />
197
+ </linearGradient>
198
+ <mask id="osMask" maskUnits="userSpaceOnUse" x={-20} y={-200} width={PW + 40} height={PH + 300}>
199
+ <rect x={-20} y={-200} width={PW + 40} height={PH + 300} fill="url(#osFade)" />
200
+ </mask>
201
+ <filter id="osGlowA" x="-10%" y="-30%" width="120%" height="160%"><feGaussianBlur stdDeviation="5" /></filter>
202
+ <filter id="osGlowB" x="-10%" y="-40%" width="120%" height="180%"><feGaussianBlur stdDeviation="16" /></filter>
203
+ <radialGradient id="osHead">
204
+ <stop offset="0" stopColor="#ffffff" stopOpacity={1} />
205
+ <stop offset="0.25" stopColor={hexMix('#5b8cff', HOT, hot)} stopOpacity={0.8} />
206
+ <stop offset="1" stopColor={hexMix('#5b8cff', HOT, hot)} stopOpacity={0} />
207
+ </radialGradient>
208
+ <linearGradient id="osFresh" x1={HEAD - 280} y1="0" x2={HEAD} y2="0" gradientUnits="userSpaceOnUse">
209
+ <stop offset="0" stopColor="#ffffff" stopOpacity={0} />
210
+ <stop offset="1" stopColor="#ffffff" stopOpacity={0.95} />
211
+ </linearGradient>
212
+ </defs>
213
+
214
+ {/* 刻度网:主格线 + 次格点阵 + 中心十字刻度;从中心展开 */}
215
+ <g opacity={on}>
216
+ {Array.from({ length: gridV + 1 }, (_, i) => {
217
+ const x = (i / gridV) * PW;
218
+ const reach = (PH / 2) * on;
219
+ return <line key={`v${i}`} x1={x} x2={x} y1={PH / 2 - reach} y2={PH / 2 + reach} stroke={L.accent} strokeOpacity={i === 0 || i === gridV ? 0.22 : 0.1} strokeWidth={1.2} />;
220
+ })}
221
+ {Array.from({ length: gridH + 1 }, (_, i) => {
222
+ const y = (i / gridH) * PH;
223
+ const reach = (PW / 2) * on;
224
+ return <line key={`h${i}`} x1={PW / 2 - reach} x2={PW / 2 + reach} y1={y} y2={y} stroke={L.accent} strokeOpacity={i === 0 || i === gridH ? 0.22 : 0.1} strokeWidth={1.2} />;
225
+ })}
226
+ {Array.from({ length: gridV * 5 + 1 }, (_, i) => (
227
+ <line key={`tk${i}`} x1={(i / (gridV * 5)) * PW} x2={(i / (gridV * 5)) * PW} y1={PH / 2 - (i % 5 ? 5 : 10)} y2={PH / 2 + (i % 5 ? 5 : 10)} stroke={L.accent} strokeOpacity={0.28} strokeWidth={1.2} />
228
+ ))}
229
+ </g>
230
+
231
+ {/* 迹线:面积 + 两层泛光 + 实线(左端渐隐出画) */}
232
+ <g mask="url(#osMask)">
233
+ <path d={areaD} fill="url(#osArea)" />
234
+ <path d={lineD} fill="none" stroke={TRACE} strokeWidth={10} opacity={0.5} filter="url(#osGlowB)" />
235
+ <path d={lineD} fill="none" stroke={TRACE} strokeWidth={5} opacity={0.75} filter="url(#osGlowA)" />
236
+ <path d={lineD} fill="none" stroke="#cfdcff" strokeWidth={3.5} strokeLinejoin="round" strokeLinecap="round" />
237
+ {/* 最新 280px:磷光最亮的"新鲜"段 */}
238
+ <path d={freshD} fill="none" stroke="url(#osFresh)" strokeWidth={4.5} strokeLinejoin="round" strokeLinecap="round" opacity={0.4 + 0.6 * live} />
239
+ {spikeD && (
240
+ <>
241
+ <path d={spikeD} fill="none" stroke={HOT} strokeWidth={14} opacity={0.55} filter="url(#osGlowB)" />
242
+ <path d={spikeD} fill="none" stroke={HOT} strokeWidth={5} strokeLinejoin="round" strokeLinecap="round" />
243
+ </>
244
+ )}
245
+ </g>
246
+
247
+ {/* 写入头:竖向扫描线 + 横向读数参考线 + 光斑 */}
248
+ <line x1={HEAD} x2={HEAD} y1={0} y2={PH} stroke={hexMix('#5b8cff', HOT, hot)} strokeOpacity={0.45 * live + 0.12} strokeWidth={1.5} />
249
+ <line x1={HEAD} x2={PW} y1={headY} y2={headY} stroke={hexMix('#cfdcff', HOT, hot)} strokeOpacity={0.4} strokeWidth={1.5} strokeDasharray="4 6" />
250
+ <circle cx={HEAD} cy={headY} r={70} fill="url(#osHead)" opacity={0.55 * live} />
251
+ <circle cx={HEAD} cy={headY} r={9} fill={hexMix('#ffffff', HOT, hot * 0.6)} stroke={L.bg[1]} strokeWidth={3} />
252
+
253
+ {/* 事件:峰顶标记 + 竖向落线 */}
254
+ {tagIn > 0 && peakPx > 40 && (
255
+ <g opacity={Math.min(1, tagIn * 1.5)}>
256
+ <line x1={peakPx} x2={peakPx} y1={peakY + 14} y2={PH} stroke={HOT} strokeOpacity={0.5} strokeWidth={1.5} strokeDasharray="3 5" />
257
+ <circle cx={peakPx} cy={peakY} r={9 * tagIn} fill={HOT} stroke={L.bg[1]} strokeWidth={3} />
258
+ </g>
259
+ )}
260
+
261
+ {/* 时间轴 */}
262
+ {['−50s', '−40s', '−30s', '−20s', '−10s', 'now'].map((t, i) => (
263
+ <text key={t} x={(HEAD * (i + 1)) / 6} y={PH + 52} textAnchor="middle" fill={i === 5 ? L.ink2 : L.ink3}
264
+ style={{ ...type(32, 500), fontFamily: FONT.sans }} opacity={headIn}>{t}</text>
265
+ ))}
266
+ </svg>
267
+
268
+ {/* y 轴刻度(屏内左上,压在主格线上方) */}
269
+ {['3k', '2k', '1k'].map((t, i) => (
270
+ <div key={t} style={{ position: 'absolute', left: 14, top: (i * 2 * PH) / 6 + 8, ...type(28, 600), color: L.ink3, opacity: on }}>{t}</div>
271
+ ))}
272
+
273
+ {/* 事件标签 */}
274
+ {tagIn > 0 && peakPx > 40 && (
275
+ <div style={{
276
+ position: 'absolute', left: peakPx + 22, top: peakY - 36, height: 72, padding: '0 26px 0 20px',
277
+ display: 'flex', alignItems: 'center', gap: 14, borderRadius: 14, whiteSpace: 'nowrap',
278
+ background: `linear-gradient(180deg, ${alpha(HOT, 0.22)}, ${alpha(HOT, 0.12)})`, border: `1px solid ${alpha(HOT, 0.55)}`,
279
+ boxShadow: `0 16px 40px -10px ${alpha('#000000', 0.6)}`,
280
+ transform: `scale(${tagIn.toFixed(4)})`, transformOrigin: '0% 50%', opacity: Math.min(1, tagIn * 1.5),
281
+ }}>
282
+ <span style={{ ...type(32, 800, { caps: true }), color: HOT }}>Burst</span>
283
+ <span style={{ ...type(32, 600), color: '#ffe3de' }}>{fmt(valueOf(PEAK_X))} fps</span>
284
+ </div>
285
+ )}
286
+ </div>
287
+ </div>
288
+ </AbsoluteFill>
289
+ );
290
+ };