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,278 +1,278 @@
1
- // voice-waveform-live —— 录音胶囊实时声纹(第二轮重设计:video-shotcraft 语音口述分镜 · 午后暖光)
2
- //
3
- // 设计决定:
4
- // - look = sand(米色 · 赤陶):与原版 raycast 暗场玻璃完全拉开——白天、生活方式、暖阳。
5
- // 主体两层:上方 92px 粗体实时转写("你说的话"),下方 1240px 暖白胶囊里的实时声纹("它在听")。
6
- // 转写逐词跟着包络出现:每个词在它那一拍的音节起点由虚到实升起,刚说出的词是赤陶色、3–8f 后沉成墨色;
7
- // 停顿段转写尾巴挂一枚闪烁光标——观众同时从"字在等"和"波形塌成点线"两处读出"停"。
8
- // - 声纹机制保持原卡定稿:64 条、1.6 帧/采样点从右往左滚动、梯形说停包络 × 音节值噪声 × 中部 sin^0.8 权重
9
- // × 逐条 jitter,静默钳到 6px 点线。条色 = 赤陶纵向渐变,越旧越淡;麦克风钮赤陶底 + 随包络外扩的呼吸环;
10
- // 胶囊下方地面暖光随音量亮灭。
11
- // - 提交:按钮压缩回弹、波形 12f ease-in 塌缩,转写整体上移缩小并收进一枚赤陶色消息气泡(墨字 → 白字),
12
- // 气泡下出 "Sent to Shotcraft · 0:03";胶囊退回待机(麦克风变灰、点线)。结尾帧 = 一张完整的对话海报。
13
- //
14
- // 时间表(30fps,共 172f):
15
- // 0–14 入场:胶囊 1.04→1 收焦淡入,标签 "Shotcraft is listening" 跟进(6f 后),提示语 Describe your next shot… 浮现、15f 首词前淡出
16
- // 15–57 说:Make a launch film for Friday,(逐词 17/22/25/32/40/45)
17
- // 57–80 停:波形塌成点线、转写尾光标闪烁(停顿必须真的"停")
18
- // 80–124 说:open with a crash zoom.(82/88/92/102/112)
19
- // 126 提交:按钮 1→0.82→1,波形 12f 塌缩到 0.06,箭头上飞、对勾落入
20
- // 128–150 转写上移 + 缩到 0.72 收进气泡(22f,EASE.swift),气泡底色 / 白字 140 前到位
21
- // 140–152 "Sent" 行升起;胶囊下沉 24px 退回待机
22
- // 152–172 hold:对话海报定格,暖光极缓呼吸
23
- import React from 'react';
24
- import { AbsoluteFill, interpolate, useCurrentFrame } from 'remotion';
25
- import { EASE, FONT, mix, ramp } from '../../_fixtures/Polish';
26
- import { LOOKS, Stage, alpha } from '../../_fixtures/Look';
27
- import { BRAND } from '../../_fixtures/Brand';
28
-
29
- export const VOICE_WAVEFORM_LIVE_DURATION = 172;
30
-
31
- const L = LOOKS.sand;
32
-
33
- const mulberry32 = (a: number) => () => {
34
- let t = (a += 0x6d2b79f5);
35
- t = Math.imul(t ^ (t >>> 15), t | 1);
36
- t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
37
- return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
38
- };
39
-
40
- // 值噪声:整数采样点取种子随机值,采样点之间平滑插值
41
- const noiseAt = (x: number) => {
42
- const i = Math.floor(x);
43
- const fr = x - i;
44
- const a = mulberry32(i * 7919 + 13)();
45
- const b = mulberry32((i + 1) * 7919 + 13)();
46
- const s = fr * fr * (3 - 2 * fr); // smoothstep
47
- return a + (b - a) * s;
48
- };
49
-
50
- // 说话包络(按"声音发生时刻"计):说→停→说
51
- const envelope = (t: number) => {
52
- const seg = (a: number, b: number, rise = 5, fall = 7) =>
53
- interpolate(t, [a, a + rise, b - fall, b], [0, 1, 1, 0], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
54
- const talk = Math.max(seg(15, 57), seg(80, 124));
55
- const syllable = 0.55 + 0.45 * noiseAt(t / 4.5 + 200);
56
- return talk * syllable;
57
- };
58
-
59
- const N_BARS = 64;
60
- const SCROLL = 1.6; // 帧/采样点:滚动速度
61
- const MAX_H = 150;
62
- const SUBMIT = 126;
63
-
64
- // 逐词转写:词在它那一拍的音节起点出现
65
- const LINES: { w: string; at: number }[][] = [
66
- [{ w: 'Make', at: 17 }, { w: 'a', at: 22 }, { w: 'launch', at: 25 }, { w: 'film', at: 32 }, { w: 'for', at: 40 }, { w: 'Friday,', at: 45 }],
67
- [{ w: 'open', at: 82 }, { w: 'with', at: 88 }, { w: 'a', at: 92 }, { w: 'crash', at: 102 }, { w: 'zoom.', at: 112 }],
68
- ];
69
-
70
- const CAP = { w: 1240, h: 196, cy: 760 };
71
- const TEXT_CY = 372;
72
-
73
- export const VoiceWaveformLive: React.FC = () => {
74
- const f = useCurrentFrame();
75
-
76
- // ── 入场 ──
77
- const inT = ramp(f, 0, 14, EASE.snappy);
78
- const labelT = ramp(f, 6, 12, EASE.out);
79
-
80
- // ── 提交 ──
81
- const submitted = f >= SUBMIT;
82
- const btnPress = interpolate(f, [SUBMIT, SUBMIT + 3, SUBMIT + 9], [1, 0.82, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
83
- const collapse = mix(1, 0.06, ramp(f, SUBMIT, 12, EASE.exit));
84
- const arrowOut = ramp(f, SUBMIT + 1, 6, EASE.exit);
85
- const checkIn = ramp(f, SUBMIT + 4, 8, EASE.overshoot);
86
- const toBubble = ramp(f, SUBMIT + 2, 22, EASE.swift);
87
- const bubbleFill = ramp(f, SUBMIT + 6, 10, EASE.out);
88
- const sentT = ramp(f, SUBMIT + 14, 12, EASE.out);
89
- const idle = ramp(f, SUBMIT + 14, 14, EASE.swift); // 胶囊退回待机
90
-
91
- // ── 声纹 ──
92
- const bars = Array.from({ length: N_BARS }, (_, i) => {
93
- const sampleT = f - (N_BARS - 1 - i) * SCROLL; // 最右条是"现在",越靠左越旧
94
- const env = sampleT < 0 ? 0 : envelope(sampleT);
95
- const center = Math.pow(Math.sin((i / (N_BARS - 1)) * Math.PI), 0.8);
96
- const jitter = 0.35 + 0.65 * noiseAt(sampleT * 1.7 + i * 0.13);
97
- return Math.max(6, env * center * jitter * MAX_H * collapse);
98
- });
99
- const nowEnv = submitted ? 0 : envelope(f);
100
- const level = (bars.slice(-12).reduce((a, b) => a + b, 0) / 12 / MAX_H) * collapse;
101
-
102
- // 计时(说话时长,提交后停住)
103
- const secs = Math.min(f, SUBMIT) / 30;
104
- const timer = `0:${String(Math.floor(Math.max(0, secs - 0.4))).padStart(2, '0')}`;
105
-
106
- // 转写尾光标:说话中常亮、停顿闪烁、提交后消失
107
- const lastAt = LINES.flat().filter((w) => f >= w.at).pop()?.at ?? -99;
108
- const talking = nowEnv > 0.05;
109
- const caretOn = !submitted && f > 14 && (talking || Math.floor((f - lastAt) / 8) % 2 === 0);
110
-
111
- // 转写 → 气泡:上移 + 缩到 0.72
112
- const textScale = mix(1, 0.72, toBubble);
113
- const textY = mix(TEXT_CY, 330, toBubble);
114
- const hintO = ramp(f, 4, 10, EASE.out) * (1 - ramp(f, 15, 4, EASE.linear)); // 开口前的提示语
115
- const inkToWhite = bubbleFill;
116
-
117
- const word = (w: { w: string; at: number }, k: number) => {
118
- const p = ramp(f, w.at, 8, EASE.snappy);
119
- const fresh = 1 - ramp(f, w.at + 3, 6, EASE.linear); // 刚说出 → 赤陶,之后沉成墨
120
- const c = inkToWhite > 0 ? mixColor(L.ink, '#fff8f0', inkToWhite) : mixColor(L.ink, L.accent, fresh);
121
- return (
122
- <span key={k} style={{
123
- display: 'inline-block', marginRight: '0.24em', opacity: p, color: c,
124
- filter: p < 1 ? `blur(${((1 - p) * 10).toFixed(2)}px)` : undefined,
125
- transform: `translateY(${((1 - p) * 0.22).toFixed(3)}em)`,
126
- }}>
127
- {w.w}
128
- {/* 尾光标挂在最后一个已出现的词后面 */}
129
- {caretOn && w.at === lastAt && (
130
- <span style={{ display: 'inline-block', width: 6, height: '0.8em', verticalAlign: '-0.08em', marginLeft: '0.06em', marginRight: '-0.12em', borderRadius: 3, background: L.accent }} />
131
- )}
132
- </span>
133
- );
134
- };
135
-
136
- return (
137
- <AbsoluteFill style={{ background: L.bg[1], overflow: 'hidden', fontFamily: FONT.sans }}>
138
- <Stage look={L} keyLight={{ x: 0.3, y: 0.0 }} fill={{ x: 0.78, y: 0.9 }} breathe={0.4}>
139
- {/* 胶囊下的地面暖光:随"现在"的音量亮灭 */}
140
- <div style={{
141
- position: 'absolute', left: 960 - 820, top: CAP.cy - 40, width: 1640, height: 420,
142
- background: `radial-gradient(ellipse 50% 46% at 50% 40%, ${alpha('#e2885a', 0.08 + 0.22 * level)} 0%, ${alpha('#e2885a', 0)} 70%)`,
143
- opacity: inT,
144
- }} />
145
- </Stage>
146
-
147
- {/* ── 实时转写 / 消息气泡 ── */}
148
- <div style={{
149
- position: 'absolute', left: 0, right: 0, top: textY, height: 0, display: 'flex', justifyContent: 'center', alignItems: 'flex-start',
150
- }}>
151
- <div style={{ position: 'relative', transform: `translateY(-50%) scale(${textScale.toFixed(4)})`, transformOrigin: '50% 50%' }}>
152
- {/* 气泡底 */}
153
- <div style={{
154
- position: 'absolute', left: -64, right: -64 + 0, top: -44, bottom: -44, borderRadius: 64,
155
- background: L.accent, opacity: bubbleFill,
156
- borderBottomRightRadius: mix(64, 18, bubbleFill),
157
- boxShadow: `0 30px 70px -26px ${alpha(L.shadow, 0.55 * bubbleFill)}, 0 8px 20px -8px ${alpha(L.shadow, 0.3 * bubbleFill)}`,
158
- }} />
159
- <div style={{ position: 'relative', fontSize: 92, fontWeight: 760, letterSpacing: '-0.035em', lineHeight: 1.08, textAlign: 'left', whiteSpace: 'nowrap' }}>
160
- {LINES.map((line, li) => (
161
- <div key={li} style={{ minHeight: '1.08em' }}>
162
- {line.map((w, k) => word(w, k))}
163
- </div>
164
- ))}
165
- </div>
166
- </div>
167
- </div>
168
-
169
- {/* 开口前的提示语:首词落下前淡出(开场上半屏不空) */}
170
- {hintO > 0.01 && (
171
- <div style={{ position: 'absolute', left: 0, right: 0, top: TEXT_CY - 52, textAlign: 'center', fontSize: 92, fontWeight: 760, letterSpacing: '-0.035em', color: alpha(L.ink3, 0.55), opacity: hintO, filter: `blur(${((1 - hintO) * 6).toFixed(2)}px)` }}>
172
- Describe your next shot…
173
- </div>
174
- )}
175
-
176
- {/* Sent 行 */}
177
- <div style={{
178
- position: 'absolute', left: 0, right: 0, top: 492, textAlign: 'center', fontSize: 32, fontWeight: 550, color: L.ink2,
179
- opacity: sentT, transform: `translateY(${((1 - sentT) * 16).toFixed(2)}px)`,
180
- }}>
181
- <span style={{ color: L.accent }}>✓</span>&nbsp; Sent to {BRAND.short} · {timer}
182
- </div>
183
-
184
- {/* 标签:Shotcraft is listening */}
185
- <div style={{
186
- position: 'absolute', left: 960 - CAP.w / 2 + 24, top: CAP.cy - CAP.h / 2 - 62, display: 'flex', alignItems: 'center', gap: 14,
187
- fontSize: 32, fontWeight: 600, color: L.ink2, letterSpacing: '-0.01em',
188
- opacity: labelT * (1 - idle), transform: `translateY(${((1 - labelT) * 10).toFixed(2)}px)`,
189
- }}>
190
- <span style={{ width: 14, height: 14, borderRadius: 7, background: L.accent, boxShadow: `0 0 0 ${(4 + 6 * nowEnv).toFixed(1)}px ${alpha(L.accent, 0.18)}` }} />
191
- {BRAND.short} is listening
192
- </div>
193
-
194
- {/* ── 胶囊 ── */}
195
- <div style={{
196
- position: 'absolute', left: 960 - CAP.w / 2, top: CAP.cy - CAP.h / 2 + 24 * idle, width: CAP.w, height: CAP.h, borderRadius: CAP.h / 2,
197
- opacity: inT, transform: `scale(${(mix(1.04, 1, inT) * mix(1, 0.94, idle)).toFixed(4)})`,
198
- filter: inT < 1 ? `blur(${((1 - inT) * 6).toFixed(2)}px)` : undefined,
199
- background: 'linear-gradient(180deg, #fffcf7 0%, #f8f1e7 100%)',
200
- boxShadow: `inset 0 1.5px 0 #ffffff, inset 0 0 0 1px rgba(70,45,20,0.07), 0 2px 4px rgba(58,36,16,0.08), 0 40px 80px -30px ${alpha(L.shadow, 0.45)}, 0 14px 30px -12px ${alpha(L.shadow, 0.22)}`,
201
- display: 'flex', alignItems: 'center', padding: '0 38px', gap: 30, boxSizing: 'border-box',
202
- }}>
203
- {/* 麦克风钮:赤陶底,说话时外扩呼吸环 */}
204
- <div style={{ position: 'relative', width: 120, height: 120, flex: 'none' }}>
205
- {[0, 1].map((k) => (
206
- <div key={k} style={{
207
- position: 'absolute', inset: -(8 + (14 + k * 14) * nowEnv), borderRadius: '50%',
208
- background: alpha(L.accent, (0.14 - k * 0.06) * Math.min(1, nowEnv * 1.6)),
209
- }} />
210
- ))}
211
- <div style={{
212
- position: 'absolute', inset: 0, borderRadius: '50%',
213
- background: idle > 0 ? mixColor('#cc5a30', '#d9cfc2', idle) : 'linear-gradient(160deg, #d8673a, #b8481f)',
214
- boxShadow: `inset 0 1.5px 0 rgba(255,255,255,0.35), 0 8px 20px -8px ${alpha('#b8481f', 0.6 * (1 - idle))}`,
215
- display: 'flex', alignItems: 'center', justifyContent: 'center',
216
- }}>
217
- <svg width={56} height={56} viewBox="0 0 24 24" fill="none">
218
- <rect x={8.5} y={3} width={7} height={12} rx={3.5} fill="#fff8f0" />
219
- <path d="M5.5 11.5a6.5 6.5 0 0 0 13 0" stroke="#fff8f0" strokeWidth={1.9} strokeLinecap="round" />
220
- <path d="M12 18v3M9 21h6" stroke="#fff8f0" strokeWidth={1.9} strokeLinecap="round" />
221
- </svg>
222
- </div>
223
- </div>
224
-
225
- {/* 声纹 */}
226
- <div style={{
227
- flex: 1, height: 160, display: 'flex', alignItems: 'center', gap: 5, overflow: 'hidden',
228
- WebkitMaskImage: 'linear-gradient(90deg, transparent 0%, #000 14%, #000 100%)',
229
- maskImage: 'linear-gradient(90deg, transparent 0%, #000 14%, #000 100%)',
230
- }}>
231
- {bars.map((h, i) => {
232
- const k = Math.min(1, h / MAX_H);
233
- const age = i / (N_BARS - 1); // 0 = 最旧
234
- const quiet = h <= 7 || collapse < 0.25;
235
- return (
236
- <div key={i} style={{
237
- flex: 1, height: h, borderRadius: 99,
238
- background: quiet
239
- ? alpha(L.ink3, 0.55)
240
- : `linear-gradient(180deg, ${alpha('#e8956a', 0.6 + 0.4 * age)} 0%, ${alpha(L.accent, 0.65 + 0.35 * age)} 50%, ${alpha('#e8956a', 0.6 + 0.4 * age)} 100%)`,
241
- boxShadow: !quiet && i === N_BARS - 1 && !submitted ? `0 0 14px ${alpha(L.accent, 0.5 * k)}` : undefined,
242
- }} />
243
- );
244
- })}
245
- </div>
246
-
247
- {/* 计时 */}
248
- <div style={{ fontSize: 32, fontWeight: 600, color: L.ink2, fontVariantNumeric: 'tabular-nums', width: 70, textAlign: 'right', flex: 'none' }}>{timer}</div>
249
-
250
- {/* 提交钮:墨色圆 + 上箭头;提交时箭头上飞、对勾落入 */}
251
- <div style={{
252
- position: 'relative', width: 120, height: 120, borderRadius: 60, flex: 'none', overflow: 'hidden',
253
- background: 'linear-gradient(180deg, #2c241b, #191410)', transform: `scale(${btnPress.toFixed(4)})`,
254
- display: 'flex', alignItems: 'center', justifyContent: 'center',
255
- boxShadow: `inset 0 1.5px 0 rgba(255,255,255,0.14), 0 10px 24px -8px ${alpha(L.shadow, 0.6)}`,
256
- }}>
257
- <svg width={52} height={52} viewBox="0 0 24 24" style={{ position: 'absolute', opacity: 1 - arrowOut, transform: `translateY(${(-30 * arrowOut).toFixed(2)}px)` }}>
258
- <path d="M12 20V5M12 5l-6.5 6.5M12 5l6.5 6.5" stroke="#fff8f0" strokeWidth={2.6} strokeLinecap="round" strokeLinejoin="round" fill="none" />
259
- </svg>
260
- {checkIn > 0.001 && (
261
- <svg width={54} height={54} viewBox="0 0 24 24" style={{ position: 'absolute', opacity: Math.min(1, checkIn * 1.4), transform: `translateY(${(16 * (1 - checkIn)).toFixed(2)}px) scale(${(0.7 + 0.3 * checkIn).toFixed(3)})` }}>
262
- <path d="M5.5 12.5l4.2 4.2L18.5 7.8" stroke="#fff8f0" strokeWidth={2.6} strokeLinecap="round" strokeLinejoin="round" fill="none" />
263
- </svg>
264
- )}
265
- </div>
266
- </div>
267
- </AbsoluteFill>
268
- );
269
- };
270
-
271
- // 两个 hex 颜色按 t 混合 → rgb()
272
- function mixColor(a: string, b: string, t: number) {
273
- const p = (h: string) => [1, 3, 5].map((i) => parseInt(h.slice(i, i + 2), 16));
274
- const A = p(a);
275
- const B = p(b);
276
- const k = Math.max(0, Math.min(1, t));
277
- return `rgb(${A.map((v, i) => Math.round(v + (B[i] - v) * k)).join(',')})`;
278
- }
1
+ // voice-waveform-live —— 录音胶囊实时声纹(第二轮重设计:video-shotcraft 语音口述分镜 · 午后暖光)
2
+ //
3
+ // 设计决定:
4
+ // - look = sand(米色 · 赤陶):与原版 raycast 暗场玻璃完全拉开——白天、生活方式、暖阳。
5
+ // 主体两层:上方 92px 粗体实时转写("你说的话"),下方 1240px 暖白胶囊里的实时声纹("它在听")。
6
+ // 转写逐词跟着包络出现:每个词在它那一拍的音节起点由虚到实升起,刚说出的词是赤陶色、3–8f 后沉成墨色;
7
+ // 停顿段转写尾巴挂一枚闪烁光标——观众同时从"字在等"和"波形塌成点线"两处读出"停"。
8
+ // - 声纹机制保持原卡定稿:64 条、1.6 帧/采样点从右往左滚动、梯形说停包络 × 音节值噪声 × 中部 sin^0.8 权重
9
+ // × 逐条 jitter,静默钳到 6px 点线。条色 = 赤陶纵向渐变,越旧越淡;麦克风钮赤陶底 + 随包络外扩的呼吸环;
10
+ // 胶囊下方地面暖光随音量亮灭。
11
+ // - 提交:按钮压缩回弹、波形 12f ease-in 塌缩,转写整体上移缩小并收进一枚赤陶色消息气泡(墨字 → 白字),
12
+ // 气泡下出 "Sent to Shotcraft · 0:03";胶囊退回待机(麦克风变灰、点线)。结尾帧 = 一张完整的对话海报。
13
+ //
14
+ // 时间表(30fps,共 172f):
15
+ // 0–14 入场:胶囊 1.04→1 收焦淡入,标签 "Shotcraft is listening" 跟进(6f 后),提示语 Describe your next shot… 浮现、15f 首词前淡出
16
+ // 15–57 说:Make a launch film for Friday,(逐词 17/22/25/32/40/45)
17
+ // 57–80 停:波形塌成点线、转写尾光标闪烁(停顿必须真的"停")
18
+ // 80–124 说:open with a crash zoom.(82/88/92/102/112)
19
+ // 126 提交:按钮 1→0.82→1,波形 12f 塌缩到 0.06,箭头上飞、对勾落入
20
+ // 128–150 转写上移 + 缩到 0.72 收进气泡(22f,EASE.swift),气泡底色 / 白字 140 前到位
21
+ // 140–152 "Sent" 行升起;胶囊下沉 24px 退回待机
22
+ // 152–172 hold:对话海报定格,暖光极缓呼吸
23
+ import React from 'react';
24
+ import { AbsoluteFill, interpolate, useCurrentFrame } from 'remotion';
25
+ import { EASE, FONT, mix, ramp } from '../../_fixtures/Polish';
26
+ import { LOOKS, Stage, alpha } from '../../_fixtures/Look';
27
+ import { BRAND } from '../../_fixtures/Brand';
28
+
29
+ export const VOICE_WAVEFORM_LIVE_DURATION = 172;
30
+
31
+ const L = LOOKS.sand;
32
+
33
+ const mulberry32 = (a: number) => () => {
34
+ let t = (a += 0x6d2b79f5);
35
+ t = Math.imul(t ^ (t >>> 15), t | 1);
36
+ t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
37
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
38
+ };
39
+
40
+ // 值噪声:整数采样点取种子随机值,采样点之间平滑插值
41
+ const noiseAt = (x: number) => {
42
+ const i = Math.floor(x);
43
+ const fr = x - i;
44
+ const a = mulberry32(i * 7919 + 13)();
45
+ const b = mulberry32((i + 1) * 7919 + 13)();
46
+ const s = fr * fr * (3 - 2 * fr); // smoothstep
47
+ return a + (b - a) * s;
48
+ };
49
+
50
+ // 说话包络(按"声音发生时刻"计):说→停→说
51
+ const envelope = (t: number) => {
52
+ const seg = (a: number, b: number, rise = 5, fall = 7) =>
53
+ interpolate(t, [a, a + rise, b - fall, b], [0, 1, 1, 0], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
54
+ const talk = Math.max(seg(15, 57), seg(80, 124));
55
+ const syllable = 0.55 + 0.45 * noiseAt(t / 4.5 + 200);
56
+ return talk * syllable;
57
+ };
58
+
59
+ const N_BARS = 64;
60
+ const SCROLL = 1.6; // 帧/采样点:滚动速度
61
+ const MAX_H = 150;
62
+ const SUBMIT = 126;
63
+
64
+ // 逐词转写:词在它那一拍的音节起点出现
65
+ const LINES: { w: string; at: number }[][] = [
66
+ [{ w: 'Make', at: 17 }, { w: 'a', at: 22 }, { w: 'launch', at: 25 }, { w: 'film', at: 32 }, { w: 'for', at: 40 }, { w: 'Friday,', at: 45 }],
67
+ [{ w: 'open', at: 82 }, { w: 'with', at: 88 }, { w: 'a', at: 92 }, { w: 'crash', at: 102 }, { w: 'zoom.', at: 112 }],
68
+ ];
69
+
70
+ const CAP = { w: 1240, h: 196, cy: 760 };
71
+ const TEXT_CY = 372;
72
+
73
+ export const VoiceWaveformLive: React.FC = () => {
74
+ const f = useCurrentFrame();
75
+
76
+ // ── 入场 ──
77
+ const inT = ramp(f, 0, 14, EASE.snappy);
78
+ const labelT = ramp(f, 6, 12, EASE.out);
79
+
80
+ // ── 提交 ──
81
+ const submitted = f >= SUBMIT;
82
+ const btnPress = interpolate(f, [SUBMIT, SUBMIT + 3, SUBMIT + 9], [1, 0.82, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
83
+ const collapse = mix(1, 0.06, ramp(f, SUBMIT, 12, EASE.exit));
84
+ const arrowOut = ramp(f, SUBMIT + 1, 6, EASE.exit);
85
+ const checkIn = ramp(f, SUBMIT + 4, 8, EASE.overshoot);
86
+ const toBubble = ramp(f, SUBMIT + 2, 22, EASE.swift);
87
+ const bubbleFill = ramp(f, SUBMIT + 6, 10, EASE.out);
88
+ const sentT = ramp(f, SUBMIT + 14, 12, EASE.out);
89
+ const idle = ramp(f, SUBMIT + 14, 14, EASE.swift); // 胶囊退回待机
90
+
91
+ // ── 声纹 ──
92
+ const bars = Array.from({ length: N_BARS }, (_, i) => {
93
+ const sampleT = f - (N_BARS - 1 - i) * SCROLL; // 最右条是"现在",越靠左越旧
94
+ const env = sampleT < 0 ? 0 : envelope(sampleT);
95
+ const center = Math.pow(Math.sin((i / (N_BARS - 1)) * Math.PI), 0.8);
96
+ const jitter = 0.35 + 0.65 * noiseAt(sampleT * 1.7 + i * 0.13);
97
+ return Math.max(6, env * center * jitter * MAX_H * collapse);
98
+ });
99
+ const nowEnv = submitted ? 0 : envelope(f);
100
+ const level = (bars.slice(-12).reduce((a, b) => a + b, 0) / 12 / MAX_H) * collapse;
101
+
102
+ // 计时(说话时长,提交后停住)
103
+ const secs = Math.min(f, SUBMIT) / 30;
104
+ const timer = `0:${String(Math.floor(Math.max(0, secs - 0.4))).padStart(2, '0')}`;
105
+
106
+ // 转写尾光标:说话中常亮、停顿闪烁、提交后消失
107
+ const lastAt = LINES.flat().filter((w) => f >= w.at).pop()?.at ?? -99;
108
+ const talking = nowEnv > 0.05;
109
+ const caretOn = !submitted && f > 14 && (talking || Math.floor((f - lastAt) / 8) % 2 === 0);
110
+
111
+ // 转写 → 气泡:上移 + 缩到 0.72
112
+ const textScale = mix(1, 0.72, toBubble);
113
+ const textY = mix(TEXT_CY, 330, toBubble);
114
+ const hintO = ramp(f, 4, 10, EASE.out) * (1 - ramp(f, 15, 4, EASE.linear)); // 开口前的提示语
115
+ const inkToWhite = bubbleFill;
116
+
117
+ const word = (w: { w: string; at: number }, k: number) => {
118
+ const p = ramp(f, w.at, 8, EASE.snappy);
119
+ const fresh = 1 - ramp(f, w.at + 3, 6, EASE.linear); // 刚说出 → 赤陶,之后沉成墨
120
+ const c = inkToWhite > 0 ? mixColor(L.ink, '#fff8f0', inkToWhite) : mixColor(L.ink, L.accent, fresh);
121
+ return (
122
+ <span key={k} style={{
123
+ display: 'inline-block', marginRight: '0.24em', opacity: p, color: c,
124
+ filter: p < 1 ? `blur(${((1 - p) * 10).toFixed(2)}px)` : undefined,
125
+ transform: `translateY(${((1 - p) * 0.22).toFixed(3)}em)`,
126
+ }}>
127
+ {w.w}
128
+ {/* 尾光标挂在最后一个已出现的词后面 */}
129
+ {caretOn && w.at === lastAt && (
130
+ <span style={{ display: 'inline-block', width: 6, height: '0.8em', verticalAlign: '-0.08em', marginLeft: '0.06em', marginRight: '-0.12em', borderRadius: 3, background: L.accent }} />
131
+ )}
132
+ </span>
133
+ );
134
+ };
135
+
136
+ return (
137
+ <AbsoluteFill style={{ background: L.bg[1], overflow: 'hidden', fontFamily: FONT.sans }}>
138
+ <Stage look={L} keyLight={{ x: 0.3, y: 0.0 }} fill={{ x: 0.78, y: 0.9 }} breathe={0.4}>
139
+ {/* 胶囊下的地面暖光:随"现在"的音量亮灭 */}
140
+ <div style={{
141
+ position: 'absolute', left: 960 - 820, top: CAP.cy - 40, width: 1640, height: 420,
142
+ background: `radial-gradient(ellipse 50% 46% at 50% 40%, ${alpha('#e2885a', 0.08 + 0.22 * level)} 0%, ${alpha('#e2885a', 0)} 70%)`,
143
+ opacity: inT,
144
+ }} />
145
+ </Stage>
146
+
147
+ {/* ── 实时转写 / 消息气泡 ── */}
148
+ <div style={{
149
+ position: 'absolute', left: 0, right: 0, top: textY, height: 0, display: 'flex', justifyContent: 'center', alignItems: 'flex-start',
150
+ }}>
151
+ <div style={{ position: 'relative', transform: `translateY(-50%) scale(${textScale.toFixed(4)})`, transformOrigin: '50% 50%' }}>
152
+ {/* 气泡底 */}
153
+ <div style={{
154
+ position: 'absolute', left: -64, right: -64 + 0, top: -44, bottom: -44, borderRadius: 64,
155
+ background: L.accent, opacity: bubbleFill,
156
+ borderBottomRightRadius: mix(64, 18, bubbleFill),
157
+ boxShadow: `0 30px 70px -26px ${alpha(L.shadow, 0.55 * bubbleFill)}, 0 8px 20px -8px ${alpha(L.shadow, 0.3 * bubbleFill)}`,
158
+ }} />
159
+ <div style={{ position: 'relative', fontSize: 92, fontWeight: 760, letterSpacing: '-0.035em', lineHeight: 1.08, textAlign: 'left', whiteSpace: 'nowrap' }}>
160
+ {LINES.map((line, li) => (
161
+ <div key={li} style={{ minHeight: '1.08em' }}>
162
+ {line.map((w, k) => word(w, k))}
163
+ </div>
164
+ ))}
165
+ </div>
166
+ </div>
167
+ </div>
168
+
169
+ {/* 开口前的提示语:首词落下前淡出(开场上半屏不空) */}
170
+ {hintO > 0.01 && (
171
+ <div style={{ position: 'absolute', left: 0, right: 0, top: TEXT_CY - 52, textAlign: 'center', fontSize: 92, fontWeight: 760, letterSpacing: '-0.035em', color: alpha(L.ink3, 0.55), opacity: hintO, filter: `blur(${((1 - hintO) * 6).toFixed(2)}px)` }}>
172
+ Describe your next shot…
173
+ </div>
174
+ )}
175
+
176
+ {/* Sent 行 */}
177
+ <div style={{
178
+ position: 'absolute', left: 0, right: 0, top: 492, textAlign: 'center', fontSize: 32, fontWeight: 550, color: L.ink2,
179
+ opacity: sentT, transform: `translateY(${((1 - sentT) * 16).toFixed(2)}px)`,
180
+ }}>
181
+ <span style={{ color: L.accent }}>✓</span>&nbsp; Sent to {BRAND.short} · {timer}
182
+ </div>
183
+
184
+ {/* 标签:Shotcraft is listening */}
185
+ <div style={{
186
+ position: 'absolute', left: 960 - CAP.w / 2 + 24, top: CAP.cy - CAP.h / 2 - 62, display: 'flex', alignItems: 'center', gap: 14,
187
+ fontSize: 32, fontWeight: 600, color: L.ink2, letterSpacing: '-0.01em',
188
+ opacity: labelT * (1 - idle), transform: `translateY(${((1 - labelT) * 10).toFixed(2)}px)`,
189
+ }}>
190
+ <span style={{ width: 14, height: 14, borderRadius: 7, background: L.accent, boxShadow: `0 0 0 ${(4 + 6 * nowEnv).toFixed(1)}px ${alpha(L.accent, 0.18)}` }} />
191
+ {BRAND.short} is listening
192
+ </div>
193
+
194
+ {/* ── 胶囊 ── */}
195
+ <div style={{
196
+ position: 'absolute', left: 960 - CAP.w / 2, top: CAP.cy - CAP.h / 2 + 24 * idle, width: CAP.w, height: CAP.h, borderRadius: CAP.h / 2,
197
+ opacity: inT, transform: `scale(${(mix(1.04, 1, inT) * mix(1, 0.94, idle)).toFixed(4)})`,
198
+ filter: inT < 1 ? `blur(${((1 - inT) * 6).toFixed(2)}px)` : undefined,
199
+ background: 'linear-gradient(180deg, #fffcf7 0%, #f8f1e7 100%)',
200
+ boxShadow: `inset 0 1.5px 0 #ffffff, inset 0 0 0 1px rgba(70,45,20,0.07), 0 2px 4px rgba(58,36,16,0.08), 0 40px 80px -30px ${alpha(L.shadow, 0.45)}, 0 14px 30px -12px ${alpha(L.shadow, 0.22)}`,
201
+ display: 'flex', alignItems: 'center', padding: '0 38px', gap: 30, boxSizing: 'border-box',
202
+ }}>
203
+ {/* 麦克风钮:赤陶底,说话时外扩呼吸环 */}
204
+ <div style={{ position: 'relative', width: 120, height: 120, flex: 'none' }}>
205
+ {[0, 1].map((k) => (
206
+ <div key={k} style={{
207
+ position: 'absolute', inset: -(8 + (14 + k * 14) * nowEnv), borderRadius: '50%',
208
+ background: alpha(L.accent, (0.14 - k * 0.06) * Math.min(1, nowEnv * 1.6)),
209
+ }} />
210
+ ))}
211
+ <div style={{
212
+ position: 'absolute', inset: 0, borderRadius: '50%',
213
+ background: idle > 0 ? mixColor('#cc5a30', '#d9cfc2', idle) : 'linear-gradient(160deg, #d8673a, #b8481f)',
214
+ boxShadow: `inset 0 1.5px 0 rgba(255,255,255,0.35), 0 8px 20px -8px ${alpha('#b8481f', 0.6 * (1 - idle))}`,
215
+ display: 'flex', alignItems: 'center', justifyContent: 'center',
216
+ }}>
217
+ <svg width={56} height={56} viewBox="0 0 24 24" fill="none">
218
+ <rect x={8.5} y={3} width={7} height={12} rx={3.5} fill="#fff8f0" />
219
+ <path d="M5.5 11.5a6.5 6.5 0 0 0 13 0" stroke="#fff8f0" strokeWidth={1.9} strokeLinecap="round" />
220
+ <path d="M12 18v3M9 21h6" stroke="#fff8f0" strokeWidth={1.9} strokeLinecap="round" />
221
+ </svg>
222
+ </div>
223
+ </div>
224
+
225
+ {/* 声纹 */}
226
+ <div style={{
227
+ flex: 1, height: 160, display: 'flex', alignItems: 'center', gap: 5, overflow: 'hidden',
228
+ WebkitMaskImage: 'linear-gradient(90deg, transparent 0%, #000 14%, #000 100%)',
229
+ maskImage: 'linear-gradient(90deg, transparent 0%, #000 14%, #000 100%)',
230
+ }}>
231
+ {bars.map((h, i) => {
232
+ const k = Math.min(1, h / MAX_H);
233
+ const age = i / (N_BARS - 1); // 0 = 最旧
234
+ const quiet = h <= 7 || collapse < 0.25;
235
+ return (
236
+ <div key={i} style={{
237
+ flex: 1, height: h, borderRadius: 99,
238
+ background: quiet
239
+ ? alpha(L.ink3, 0.55)
240
+ : `linear-gradient(180deg, ${alpha('#e8956a', 0.6 + 0.4 * age)} 0%, ${alpha(L.accent, 0.65 + 0.35 * age)} 50%, ${alpha('#e8956a', 0.6 + 0.4 * age)} 100%)`,
241
+ boxShadow: !quiet && i === N_BARS - 1 && !submitted ? `0 0 14px ${alpha(L.accent, 0.5 * k)}` : undefined,
242
+ }} />
243
+ );
244
+ })}
245
+ </div>
246
+
247
+ {/* 计时 */}
248
+ <div style={{ fontSize: 32, fontWeight: 600, color: L.ink2, fontVariantNumeric: 'tabular-nums', width: 70, textAlign: 'right', flex: 'none' }}>{timer}</div>
249
+
250
+ {/* 提交钮:墨色圆 + 上箭头;提交时箭头上飞、对勾落入 */}
251
+ <div style={{
252
+ position: 'relative', width: 120, height: 120, borderRadius: 60, flex: 'none', overflow: 'hidden',
253
+ background: 'linear-gradient(180deg, #2c241b, #191410)', transform: `scale(${btnPress.toFixed(4)})`,
254
+ display: 'flex', alignItems: 'center', justifyContent: 'center',
255
+ boxShadow: `inset 0 1.5px 0 rgba(255,255,255,0.14), 0 10px 24px -8px ${alpha(L.shadow, 0.6)}`,
256
+ }}>
257
+ <svg width={52} height={52} viewBox="0 0 24 24" style={{ position: 'absolute', opacity: 1 - arrowOut, transform: `translateY(${(-30 * arrowOut).toFixed(2)}px)` }}>
258
+ <path d="M12 20V5M12 5l-6.5 6.5M12 5l6.5 6.5" stroke="#fff8f0" strokeWidth={2.6} strokeLinecap="round" strokeLinejoin="round" fill="none" />
259
+ </svg>
260
+ {checkIn > 0.001 && (
261
+ <svg width={54} height={54} viewBox="0 0 24 24" style={{ position: 'absolute', opacity: Math.min(1, checkIn * 1.4), transform: `translateY(${(16 * (1 - checkIn)).toFixed(2)}px) scale(${(0.7 + 0.3 * checkIn).toFixed(3)})` }}>
262
+ <path d="M5.5 12.5l4.2 4.2L18.5 7.8" stroke="#fff8f0" strokeWidth={2.6} strokeLinecap="round" strokeLinejoin="round" fill="none" />
263
+ </svg>
264
+ )}
265
+ </div>
266
+ </div>
267
+ </AbsoluteFill>
268
+ );
269
+ };
270
+
271
+ // 两个 hex 颜色按 t 混合 → rgb()
272
+ function mixColor(a: string, b: string, t: number) {
273
+ const p = (h: string) => [1, 3, 5].map((i) => parseInt(h.slice(i, i + 2), 16));
274
+ const A = p(a);
275
+ const B = p(b);
276
+ const k = Math.max(0, Math.min(1, t));
277
+ return `rgb(${A.map((v, i) => Math.round(v + (B[i] - v) * k)).join(',')})`;
278
+ }