dsh-drawai 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/lib/client.js +142 -16
- package/lib/index.js +7945 -7719
- package/lib/motion/asset-pack.js +394 -394
- package/lib/motion/assets.js +291 -291
- package/lib/motion/demo-assets-lock.js +10 -10
- package/lib/motion/mgstyles/briefs/23-ink-wash.md +147 -0
- package/lib/motion/mgstyles/catalog.d/23-ink-wash.json +28 -0
- package/lib/motion/mgstyles/catalog.json +127 -14
- package/lib/motion/mgstyles/upstream/demos/23-ink-wash/brush.js +149 -0
- package/lib/motion/mgstyles/upstream/demos/23-ink-wash/film.js +202 -0
- package/lib/motion/mgstyles/upstream/manifest.json +28 -3
- package/lib/motion/mgstyles/upstream/prompts/23-ink-wash.md +59 -0
- package/lib/motion/mgstyles/vendor/README.md +28 -28
- package/lib/motion/mgstyles/vendor/modules/d3/LICENSE +13 -13
- package/lib/motion/mgstyles/vendor/modules/d3/dist/d3.min.js +2 -2
- package/lib/motion/mgstyles/vendor/modules/opentype.js/LICENSE +20 -20
- package/lib/motion/mgstyles/vendor/modules/opentype.js/dist/opentype.mjs +14460 -14460
- package/lib/motion/mgstyles/vendor/modules/simplex-noise/LICENSE +21 -21
- package/lib/motion/mgstyles/vendor/modules/simplex-noise/dist/esm/simplex-noise.js +465 -465
- package/lib/motion/mgstyles/vendor/modules/topojson-client/LICENSE +13 -13
- package/lib/motion/mgstyles/vendor/modules/topojson-client/dist/topojson-client.min.js +2 -2
- package/lib/motion/project.js +5 -1
- package/lib/motion/qa.js +116 -6
- package/lib/motion/render.js +179 -179
- package/lib/motion/scene-kit.js +1 -1
- package/lib/motion/shotcraft/upstream/SKILL.md +286 -286
- package/lib/motion/shotcraft/upstream/assets/lib/Caption.tsx +54 -54
- package/lib/motion/shotcraft/upstream/assets/lib/ClipCard.tsx +200 -200
- package/lib/motion/shotcraft/upstream/assets/lib/DigitRoll.tsx +45 -45
- package/lib/motion/shotcraft/upstream/assets/lib/FlashCut.tsx +20 -20
- package/lib/motion/shotcraft/upstream/assets/lib/FlatPanel.tsx +65 -65
- package/lib/motion/shotcraft/upstream/assets/lib/PageCam.tsx +151 -151
- package/lib/motion/shotcraft/upstream/assets/lib/VerticalTicker.tsx +129 -129
- package/lib/motion/shotcraft/upstream/assets/lib/helpers/camera.tsx +75 -75
- package/lib/motion/shotcraft/upstream/assets/lib/helpers/motion.ts +40 -40
- package/lib/motion/shotcraft/upstream/assets/lib/helpers/rand.ts +11 -11
- package/lib/motion/shotcraft/upstream/assets/lib/helpers/shake.ts +10 -10
- package/lib/motion/shotcraft/upstream/assets/scripts/build-readme-cover.mjs +49 -49
- package/lib/motion/shotcraft/upstream/assets/scripts/capture-template.mjs +210 -210
- package/lib/motion/shotcraft/upstream/assets/scripts/sfx-source.py +423 -423
- package/lib/motion/shotcraft/upstream/assets/scripts/smoke-render-demos.py +170 -170
- package/lib/motion/shotcraft/upstream/assets/scripts/test_sfx_source.py +157 -157
- package/lib/motion/shotcraft/upstream/demos/README.md +120 -120
- package/lib/motion/shotcraft/upstream/demos/_fixtures/Brand.tsx +112 -112
- package/lib/motion/shotcraft/upstream/demos/_fixtures/Fixtures.tsx +647 -647
- package/lib/motion/shotcraft/upstream/demos/_fixtures/Look.tsx +316 -316
- package/lib/motion/shotcraft/upstream/demos/_fixtures/Motion.tsx +82 -82
- package/lib/motion/shotcraft/upstream/demos/_fixtures/PageCam2D.tsx +115 -115
- package/lib/motion/shotcraft/upstream/demos/_fixtures/Polish.tsx +243 -243
- package/lib/motion/shotcraft/upstream/demos/_textures/live-layout.json +388 -388
- package/lib/motion/shotcraft/upstream/demos/camera/basic-3d-scene/Basic3DScene.tsx +250 -250
- package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashImpactReal.tsx +305 -305
- package/lib/motion/shotcraft/upstream/demos/camera/crash-zoom-punch/CrashZoomReal.tsx +246 -246
- package/lib/motion/shotcraft/upstream/demos/camera/cursor-flyover/CursorFlyover.tsx +390 -390
- package/lib/motion/shotcraft/upstream/demos/camera/depth-layer-moves/MultiplaneReal.tsx +138 -138
- package/lib/motion/shotcraft/upstream/demos/camera/graze-face-tour/GrazeFaceTour.tsx +542 -542
- package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/OverheadTabletopDrop.tsx +315 -315
- package/lib/motion/shotcraft/upstream/demos/camera/overhead-camera-moves/TiltReveal.tsx +299 -299
- package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/DroneDiveLanding.tsx +173 -173
- package/lib/motion/shotcraft/upstream/demos/camera/space-camera-moves/ExplodedView.tsx +348 -348
- package/lib/motion/shotcraft/upstream/demos/camera/steep-tilt-glide/SteepTiltGlide.tsx +366 -366
- package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/BulletTimeFreezeOrbit.tsx +279 -279
- package/lib/motion/shotcraft/upstream/demos/camera/tension-camera-moves/PullBackIsolation.tsx +184 -184
- package/lib/motion/shotcraft/upstream/demos/camera/terminal-3d/Terminal3D.tsx +390 -390
- package/lib/motion/shotcraft/upstream/demos/data/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +155 -155
- package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/AxisRescaleShockV2.tsx +303 -303
- package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/OscilloscopeStreamV2.tsx +290 -290
- package/lib/motion/shotcraft/upstream/demos/data/chart-live-moves/UnitDotSwarmRegroupV2.tsx +278 -278
- package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/NeedleSweepSelftest.tsx +307 -307
- package/lib/motion/shotcraft/upstream/demos/data/gauge-readout-moves/TapeScrollFixedPointer.tsx +215 -215
- package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/BrakeReticleLock.tsx +299 -299
- package/lib/motion/shotcraft/upstream/demos/data/scroll-brake-moves/ChangelogScrollBrake.tsx +232 -232
- package/lib/motion/shotcraft/upstream/demos/data/timeline-travel/TimelineTravel.tsx +290 -290
- package/lib/motion/shotcraft/upstream/demos/effects/assemble-then-type-flyin/AssembleThenTypeFlyin.tsx +273 -273
- package/lib/motion/shotcraft/upstream/demos/effects/aurora-bloom-bg-flip/AuroraBloomBgFlip.tsx +167 -167
- package/lib/motion/shotcraft/upstream/demos/effects/brand-frame-snap/BrandFrameSnap.tsx +536 -536
- package/lib/motion/shotcraft/upstream/demos/effects/fui-hud-moves/ReticleLockOn.tsx +164 -164
- package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/FlylineArc.tsx +175 -175
- package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/GlowOrbAmbient.tsx +197 -197
- package/lib/motion/shotcraft/upstream/demos/effects/glow-flyline-moves/OrbFlylineRelay.tsx +241 -241
- package/lib/motion/shotcraft/upstream/demos/effects/icon-performance-moves/AttentionBounce.tsx +279 -279
- package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/AnimeImpact.tsx +230 -230
- package/lib/motion/shotcraft/upstream/demos/effects/impact-feedback/HitCounter.tsx +345 -345
- package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SheenSweepRetry.tsx +275 -275
- package/lib/motion/shotcraft/upstream/demos/effects/light-play-moves/SpotlightSweepReveal.tsx +229 -229
- package/lib/motion/shotcraft/upstream/demos/effects/radial-ripple-phone-chips/RadialRipplePhoneChips.tsx +312 -312
- package/lib/motion/shotcraft/upstream/demos/effects/riso-print-hits/RisoMisregistrationHit.tsx +222 -222
- package/lib/motion/shotcraft/upstream/demos/effects/scan-bracket-sweep/ScanBracketSweep.tsx +295 -295
- package/lib/motion/shotcraft/upstream/demos/effects/scanline-annotate-focus/ScanlineAnnotateFocus.tsx +329 -329
- package/lib/motion/shotcraft/upstream/demos/effects/scanline-assemble-flyin/ScanlineAssembleFlyin.tsx +315 -315
- package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ImpactBurstKit.tsx +264 -264
- package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/KanadaPerspectiveSnap.tsx +260 -260
- package/lib/motion/shotcraft/upstream/demos/effects/slam-entrance-moves/ScoreSlam.tsx +263 -263
- package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/CornerSpotlightReveal.tsx +123 -123
- package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +187 -187
- package/lib/motion/shotcraft/upstream/demos/effects/spotlight-sweep-moves/SlideSpotlightPan.tsx +175 -175
- package/lib/motion/shotcraft/upstream/demos/interaction/autolayout-gap-dial/AutolayoutGapDial.tsx +305 -305
- package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/DiagramCascadeBuild.tsx +350 -350
- package/lib/motion/shotcraft/upstream/demos/interaction/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +352 -352
- package/lib/motion/shotcraft/upstream/demos/interaction/chip-grid-single-select-blackout/ChipGridSingleSelectBlackout.tsx +218 -218
- package/lib/motion/shotcraft/upstream/demos/interaction/collab-cursor-moves/CursorCastEnsemble.tsx +297 -297
- package/lib/motion/shotcraft/upstream/demos/interaction/glass-pill-dictation-typing/GlassPillDictationTyping.tsx +157 -157
- package/lib/motion/shotcraft/upstream/demos/interaction/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +218 -218
- package/lib/motion/shotcraft/upstream/demos/interaction/picker-carousel-feature-cycle/PickerCarouselFeatureCycle.tsx +202 -202
- package/lib/motion/shotcraft/upstream/demos/interaction/segmented-thumb-hero/SegmentedThumbHero.tsx +265 -265
- package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/PaletteThemeRipple.tsx +457 -457
- package/lib/motion/shotcraft/upstream/demos/interaction/theme-switch-moves/ThemeSweepToggle.tsx +446 -446
- package/lib/motion/shotcraft/upstream/demos/interaction/type-and-filter/TypeAndFilter.tsx +249 -249
- package/lib/motion/shotcraft/upstream/demos/interaction/voice-waveform-live/VoiceWaveformLive.tsx +278 -278
- package/lib/motion/shotcraft/upstream/demos/opening/crane-rise-reveal/CraneRiseReveal.tsx +332 -332
- package/lib/motion/shotcraft/upstream/demos/opening/dataviz-landscape-open/DatavizLandscapeOpen.tsx +358 -358
- package/lib/motion/shotcraft/upstream/demos/opening/fracture/Fracture.tsx +201 -201
- package/lib/motion/shotcraft/upstream/demos/opening/icon-field-colorize/IconFieldColorize.tsx +200 -200
- package/lib/motion/shotcraft/upstream/demos/opening/letterspace-materialize/LetterspaceMaterialize.tsx +208 -208
- package/lib/motion/shotcraft/upstream/demos/opening/magician-card-flourish/MagicianCardFlourish.tsx +341 -341
- package/lib/motion/shotcraft/upstream/demos/opening/orbit-ring-title-open/OrbitRingTitleOpen.tsx +389 -389
- package/lib/motion/shotcraft/upstream/demos/opening/spotlight-hero-card/SpotlightHeroCard.tsx +293 -293
- package/lib/motion/shotcraft/upstream/demos/opening/stroke-segment-build/StrokeSegmentBuild.tsx +183 -183
- package/lib/motion/shotcraft/upstream/demos/opening/text-as-mask/TextAsMask.tsx +245 -245
- package/lib/motion/shotcraft/upstream/demos/outro/grain-dissolve/GrainDissolve.tsx +222 -222
- package/lib/motion/shotcraft/upstream/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx +223 -223
- package/lib/motion/shotcraft/upstream/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx +217 -217
- package/lib/motion/shotcraft/upstream/demos/outro/outro-group-photo-launch/OutroGroupPhotoLaunch.tsx +343 -343
- package/lib/motion/shotcraft/upstream/demos/outro/ui-strip-away-outro/UiStripAwayOutro.tsx +357 -357
- package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/IconFlipBloomLogo.tsx +187 -187
- package/lib/motion/shotcraft/upstream/demos/outro/ui-to-brand-morph/InputMorphsIntoLogo.tsx +333 -333
- package/lib/motion/shotcraft/upstream/demos/rhythm/beat-cut-moves/PaparazziFlash.tsx +274 -274
- package/lib/motion/shotcraft/upstream/demos/rhythm/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +270 -270
- package/lib/motion/shotcraft/upstream/demos/rhythm/panel-grid-moves/ComicPanelSplit.tsx +430 -430
- package/lib/motion/shotcraft/upstream/demos/rhythm/quad-split-parallel-scenes/QuadSplitParallelScenes.tsx +252 -252
- package/lib/motion/shotcraft/upstream/demos/rhythm/rhythm-interrupt-moves/JumpCutPunchIn.tsx +106 -106
- package/lib/motion/shotcraft/upstream/demos/rhythm/sakuga-timing-shift/SakugaTimingShift.tsx +288 -288
- package/lib/motion/shotcraft/upstream/demos/rhythm/speed-ramp-freeze/FreezeAnnotateReal.tsx +362 -362
- package/lib/motion/shotcraft/upstream/demos/rhythm/trailer-grammar-moves/TrailerBumper.tsx +168 -168
- package/lib/motion/shotcraft/upstream/demos/transition/bottom-push-stack-wipe/BottomPushStackWipe.tsx +310 -310
- package/lib/motion/shotcraft/upstream/demos/transition/card-flip-reveal/CardFlipReveal.tsx +261 -261
- package/lib/motion/shotcraft/upstream/demos/transition/card-flock-tumble/CardFlockTumble.tsx +459 -459
- package/lib/motion/shotcraft/upstream/demos/transition/circle-match-iris/CircleMatchIris.tsx +294 -294
- package/lib/motion/shotcraft/upstream/demos/transition/gradient-transition/GradientTransition.tsx +161 -161
- package/lib/motion/shotcraft/upstream/demos/transition/line-carry-transition/LineCarryTransition.tsx +248 -248
- package/lib/motion/shotcraft/upstream/demos/transition/mosaic-reframe/MosaicReframe.tsx +359 -359
- package/lib/motion/shotcraft/upstream/demos/transition/page-turn-transitions/BarnDoorSplit.tsx +227 -227
- package/lib/motion/shotcraft/upstream/demos/transition/print-texture-transitions/InkBleedReveal.tsx +162 -162
- package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/PortalWipeV2.tsx +248 -248
- package/lib/motion/shotcraft/upstream/demos/transition/shot-transitions/WhipBrakeReal.tsx +186 -186
- package/lib/motion/shotcraft/upstream/demos/transition/tear-streak-transitions/GlitchDisplace.tsx +355 -355
- package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/InvisibleCut.tsx +272 -272
- package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/LightLeakBurn.tsx +262 -262
- package/lib/motion/shotcraft/upstream/demos/transition/transition-hidden-cut/VersusSlam.tsx +217 -217
- package/lib/motion/shotcraft/upstream/demos/transition/transition-travel/LetterformZoom.tsx +285 -285
- package/lib/motion/shotcraft/upstream/demos/transition/white-flash-logo-simplify-cut/WhiteFlashLogoSimplifyCut.tsx +205 -205
- package/lib/motion/shotcraft/upstream/demos/transition/wipe-transitions/BlindsSlice.tsx +178 -178
- package/lib/motion/shotcraft/upstream/demos/typography/blur-slide/BlurSlide.tsx +147 -147
- package/lib/motion/shotcraft/upstream/demos/typography/brace-expand/BraceExpand.tsx +143 -143
- package/lib/motion/shotcraft/upstream/demos/typography/brand-ink-open/BrandInkOpen.tsx +134 -134
- package/lib/motion/shotcraft/upstream/demos/typography/countdown-arc-scatter/CountdownArcScatter.tsx +217 -217
- package/lib/motion/shotcraft/upstream/demos/typography/flying-words/FlyingWords.tsx +198 -198
- package/lib/motion/shotcraft/upstream/demos/typography/glitch-cycle/GlitchCycle.tsx +221 -221
- package/lib/motion/shotcraft/upstream/demos/typography/gradient-word-sweep/GradientWordSweep.tsx +312 -312
- package/lib/motion/shotcraft/upstream/demos/typography/lead-word-zoom-assemble/LeadWordZoomAssemble.tsx +261 -261
- package/lib/motion/shotcraft/upstream/demos/typography/marker-underline-title/MarkerUnderlineTitle.tsx +121 -121
- package/lib/motion/shotcraft/upstream/demos/typography/outline-word-fill/OutlineWordFill.tsx +153 -153
- package/lib/motion/shotcraft/upstream/demos/typography/paper-title-card/PaperTitleCard.tsx +179 -179
- package/lib/motion/shotcraft/upstream/demos/typography/pill-chip-slot-cycle-handled/PillChipSlotCycleHandled.tsx +140 -140
- package/lib/motion/shotcraft/upstream/demos/typography/pill-slot-cycle/PillSlotCycle.tsx +309 -309
- package/lib/motion/shotcraft/upstream/demos/typography/text-column-converge/TextColumnConverge.tsx +191 -191
- package/lib/motion/shotcraft/upstream/demos/typography/title-demote-to-label/TitleDemoteToLabel.tsx +292 -292
- package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/LetterformDriftAssembly.tsx +135 -135
- package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/SplitTextStagger.tsx +124 -124
- package/lib/motion/shotcraft/upstream/demos/typography/type-assembly-moves/TextOnPath.tsx +255 -255
- package/lib/motion/shotcraft/upstream/demos/typography/type-entrance-moves/LetterDropPhysics.tsx +173 -173
- package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/FontWeightPump.tsx +225 -225
- package/lib/motion/shotcraft/upstream/demos/typography/type-rhythm-sync/KaraokeFillSync.tsx +141 -141
- package/lib/motion/shotcraft/upstream/demos/typography/typewriter-moves/TypewriterErrorRetype.tsx +137 -137
- package/lib/motion/shotcraft/upstream/demos/typography/vertical-word-roll-blur-cycle/VerticalWordRollBlurCycle.tsx +147 -147
- package/lib/motion/shotcraft/upstream/demos/typography/word-relay-filmstrip/WordRelayFilmstrip.tsx +409 -409
- package/lib/motion/shotcraft/upstream/demos/typography/word-relay-geometry/WordRelayGeometry.tsx +280 -280
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/avatar-bracket-carousel/AvatarBracketCarousel.tsx +271 -271
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/bezier-source-converge-merge/BezierSourceConvergeMerge.tsx +385 -385
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/card-stack/CardStack.tsx +312 -312
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/carousel-3d/Carousel3D.tsx +303 -303
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/clipcard-looping/ClipCardLooping.tsx +77 -77
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/cloner-depth-echo/ClonerDepthEcho.tsx +311 -311
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/deck-deal-flyin/DeckDealFlyin.tsx +307 -307
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/doc-park-left-pill-deal/DocParkLeftPillDeal.tsx +349 -349
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/document-typewriter-reveal/DocumentTypewriterReveal.tsx +255 -255
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/draw-svg-trace/DrawSvgTrace.tsx +244 -244
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/element-body-moves/ContactShadowLift.tsx +217 -217
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/integration-hub-map/IntegrationHubMap.tsx +652 -652
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-reveal/ListReveal.tsx +153 -153
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/list-stack-press/ListStackPress.tsx +238 -238
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-forerun/NeonFrameForerun.tsx +324 -324
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +354 -354
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/PageWaterfallWall.tsx +101 -101
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/page-waterfall-wall/VerticalTicker.tsx +129 -129
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/product-card-progressive-assemble/ProductCardProgressiveAssemble.tsx +297 -297
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/radial-wave/RadialWave.tsx +57 -57
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/research-card-stack-scroll/ResearchCardStackScroll.tsx +155 -155
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/row-embed/RowEmbed.tsx +175 -175
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/value-stagger-gradient/ValueStaggerGradient.tsx +153 -153
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/BentoLightUp.tsx +146 -146
- package/lib/motion/shotcraft/upstream/demos/ui-entrance/wall-reveal-moves/WireframeDrawOn.tsx +226 -226
- package/lib/motion/shotcraft/upstream/gallery/api/library.json +1 -1
- package/lib/motion/shotcraft/upstream/references/aesthetic-rules.md +193 -193
- package/lib/motion/shotcraft/upstream/references/final-review.md +121 -121
- package/lib/motion/shotcraft/upstream/references/guided-free-creation.md +199 -199
- package/lib/motion/shotcraft/upstream/references/jianying-export.md +183 -183
- package/lib/motion/shotcraft/upstream/references/music-beat-sync.md +257 -257
- package/lib/motion/shotcraft/upstream/references/pipeline.md +382 -382
- package/lib/motion/shotcraft/upstream/references/publish-upload-post.md +111 -111
- package/lib/motion/shotcraft/upstream/references/sequences/promo-energy-arc.md +50 -50
- package/lib/motion/shotcraft/upstream/references/sfx-sourcing.md +95 -95
- package/lib/motion/shotcraft/upstream/references/shots/camera/basic-3d-scene.md +41 -41
- package/lib/motion/shotcraft/upstream/references/shots/camera/crash-zoom-punch.md +52 -52
- package/lib/motion/shotcraft/upstream/references/shots/camera/cursor-flyover.md +39 -39
- package/lib/motion/shotcraft/upstream/references/shots/camera/depth-layer-moves.md +39 -39
- package/lib/motion/shotcraft/upstream/references/shots/camera/graze-face-tour.md +57 -57
- package/lib/motion/shotcraft/upstream/references/shots/camera/overhead-camera-moves.md +51 -51
- package/lib/motion/shotcraft/upstream/references/shots/camera/space-camera-moves.md +46 -46
- package/lib/motion/shotcraft/upstream/references/shots/camera/steep-tilt-glide.md +52 -52
- package/lib/motion/shotcraft/upstream/references/shots/camera/tension-camera-moves.md +43 -43
- package/lib/motion/shotcraft/upstream/references/shots/camera/terminal-3d.md +42 -42
- package/lib/motion/shotcraft/upstream/references/shots/data/before-after-slider-scrub.md +48 -48
- package/lib/motion/shotcraft/upstream/references/shots/data/chart-live-moves.md +52 -52
- package/lib/motion/shotcraft/upstream/references/shots/data/gauge-readout-moves.md +45 -45
- package/lib/motion/shotcraft/upstream/references/shots/data/scroll-brake-moves.md +46 -46
- package/lib/motion/shotcraft/upstream/references/shots/data/timeline-travel.md +44 -44
- package/lib/motion/shotcraft/upstream/references/shots/effects/assemble-then-type-flyin.md +63 -63
- package/lib/motion/shotcraft/upstream/references/shots/effects/aurora-bloom-bg-flip.md +54 -54
- package/lib/motion/shotcraft/upstream/references/shots/effects/brand-frame-snap.md +58 -58
- package/lib/motion/shotcraft/upstream/references/shots/effects/fui-hud-moves.md +35 -35
- package/lib/motion/shotcraft/upstream/references/shots/effects/glow-flyline-moves.md +53 -53
- package/lib/motion/shotcraft/upstream/references/shots/effects/icon-performance-moves.md +42 -42
- package/lib/motion/shotcraft/upstream/references/shots/effects/impact-feedback.md +50 -50
- package/lib/motion/shotcraft/upstream/references/shots/effects/light-play-moves.md +46 -46
- package/lib/motion/shotcraft/upstream/references/shots/effects/radial-ripple-phone-chips.md +56 -56
- package/lib/motion/shotcraft/upstream/references/shots/effects/riso-print-hits.md +49 -49
- package/lib/motion/shotcraft/upstream/references/shots/effects/scan-bracket-sweep.md +50 -50
- package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-annotate-focus.md +53 -53
- package/lib/motion/shotcraft/upstream/references/shots/effects/scanline-assemble-flyin.md +53 -53
- package/lib/motion/shotcraft/upstream/references/shots/effects/slam-entrance-moves.md +55 -55
- package/lib/motion/shotcraft/upstream/references/shots/effects/spotlight-sweep-moves.md +52 -52
- package/lib/motion/shotcraft/upstream/references/shots/interaction/autolayout-gap-dial.md +60 -60
- package/lib/motion/shotcraft/upstream/references/shots/interaction/canvas-materialize-moves.md +57 -57
- package/lib/motion/shotcraft/upstream/references/shots/interaction/chip-grid-single-select-blackout.md +51 -51
- package/lib/motion/shotcraft/upstream/references/shots/interaction/collab-cursor-moves.md +41 -41
- package/lib/motion/shotcraft/upstream/references/shots/interaction/glass-pill-dictation-typing.md +53 -53
- package/lib/motion/shotcraft/upstream/references/shots/interaction/hashtag-to-pill-materialize.md +60 -60
- package/lib/motion/shotcraft/upstream/references/shots/interaction/picker-carousel-feature-cycle.md +55 -55
- package/lib/motion/shotcraft/upstream/references/shots/interaction/segmented-thumb-hero.md +57 -57
- package/lib/motion/shotcraft/upstream/references/shots/interaction/theme-switch-moves.md +47 -47
- package/lib/motion/shotcraft/upstream/references/shots/interaction/type-and-filter.md +37 -37
- package/lib/motion/shotcraft/upstream/references/shots/interaction/voice-waveform-live.md +54 -54
- package/lib/motion/shotcraft/upstream/references/shots/opening/brand-ink-open.md +36 -36
- package/lib/motion/shotcraft/upstream/references/shots/opening/crane-rise-reveal.md +56 -56
- package/lib/motion/shotcraft/upstream/references/shots/opening/dataviz-landscape-open.md +56 -56
- package/lib/motion/shotcraft/upstream/references/shots/opening/fracture.md +40 -40
- package/lib/motion/shotcraft/upstream/references/shots/opening/icon-field-colorize.md +60 -60
- package/lib/motion/shotcraft/upstream/references/shots/opening/letterspace-materialize.md +57 -57
- package/lib/motion/shotcraft/upstream/references/shots/opening/magician-card-flourish.md +73 -73
- package/lib/motion/shotcraft/upstream/references/shots/opening/orbit-ring-title-open.md +87 -87
- package/lib/motion/shotcraft/upstream/references/shots/opening/spotlight-hero-card.md +55 -55
- package/lib/motion/shotcraft/upstream/references/shots/opening/stroke-segment-build.md +50 -50
- package/lib/motion/shotcraft/upstream/references/shots/opening/text-as-mask.md +59 -59
- package/lib/motion/shotcraft/upstream/references/shots/outro/grain-dissolve.md +38 -38
- package/lib/motion/shotcraft/upstream/references/shots/outro/logo-shrink-wordmark-lockup.md +38 -38
- package/lib/motion/shotcraft/upstream/references/shots/outro/neon-triple-marquee.md +59 -59
- package/lib/motion/shotcraft/upstream/references/shots/outro/outro-group-photo-launch.md +39 -39
- package/lib/motion/shotcraft/upstream/references/shots/outro/ui-strip-away-outro.md +61 -61
- package/lib/motion/shotcraft/upstream/references/shots/outro/ui-to-brand-morph.md +52 -52
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-cut-moves.md +50 -50
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/beat-step-list-theme-cycle.md +66 -66
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/panel-grid-moves.md +43 -43
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/quad-split-parallel-scenes.md +38 -38
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/rhythm-interrupt-moves.md +38 -38
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/sakuga-timing-shift.md +56 -56
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/speed-ramp-freeze.md +44 -44
- package/lib/motion/shotcraft/upstream/references/shots/rhythm/trailer-grammar-moves.md +38 -38
- package/lib/motion/shotcraft/upstream/references/shots/transition/bottom-push-stack-wipe.md +63 -63
- package/lib/motion/shotcraft/upstream/references/shots/transition/card-flip-reveal.md +57 -57
- package/lib/motion/shotcraft/upstream/references/shots/transition/card-flock-tumble.md +63 -63
- package/lib/motion/shotcraft/upstream/references/shots/transition/circle-match-iris.md +58 -58
- package/lib/motion/shotcraft/upstream/references/shots/transition/gradient-transition.md +45 -45
- package/lib/motion/shotcraft/upstream/references/shots/transition/line-carry-transition.md +55 -55
- package/lib/motion/shotcraft/upstream/references/shots/transition/mosaic-reframe.md +49 -49
- package/lib/motion/shotcraft/upstream/references/shots/transition/page-turn-transitions.md +42 -42
- package/lib/motion/shotcraft/upstream/references/shots/transition/print-texture-transitions.md +42 -42
- package/lib/motion/shotcraft/upstream/references/shots/transition/shot-transitions.md +45 -45
- package/lib/motion/shotcraft/upstream/references/shots/transition/tear-streak-transitions.md +48 -48
- package/lib/motion/shotcraft/upstream/references/shots/transition/transition-hidden-cut.md +55 -55
- package/lib/motion/shotcraft/upstream/references/shots/transition/transition-travel.md +43 -43
- package/lib/motion/shotcraft/upstream/references/shots/transition/white-flash-logo-simplify-cut.md +41 -41
- package/lib/motion/shotcraft/upstream/references/shots/transition/wipe-transitions.md +42 -42
- package/lib/motion/shotcraft/upstream/references/shots/typography/blur-slide.md +59 -59
- package/lib/motion/shotcraft/upstream/references/shots/typography/brace-expand.md +55 -55
- package/lib/motion/shotcraft/upstream/references/shots/typography/countdown-arc-scatter.md +65 -65
- package/lib/motion/shotcraft/upstream/references/shots/typography/document-typewriter-reveal.md +42 -42
- package/lib/motion/shotcraft/upstream/references/shots/typography/flying-words.md +64 -64
- package/lib/motion/shotcraft/upstream/references/shots/typography/glitch-cycle.md +64 -64
- package/lib/motion/shotcraft/upstream/references/shots/typography/gradient-word-sweep.md +54 -54
- package/lib/motion/shotcraft/upstream/references/shots/typography/lead-word-zoom-assemble.md +91 -91
- package/lib/motion/shotcraft/upstream/references/shots/typography/marker-underline-title.md +51 -51
- package/lib/motion/shotcraft/upstream/references/shots/typography/outline-word-fill.md +66 -66
- package/lib/motion/shotcraft/upstream/references/shots/typography/paper-title-card.md +38 -38
- package/lib/motion/shotcraft/upstream/references/shots/typography/pill-chip-slot-cycle-handled.md +66 -66
- package/lib/motion/shotcraft/upstream/references/shots/typography/pill-slot-cycle.md +58 -58
- package/lib/motion/shotcraft/upstream/references/shots/typography/text-column-converge.md +61 -61
- package/lib/motion/shotcraft/upstream/references/shots/typography/title-demote-to-label.md +64 -64
- package/lib/motion/shotcraft/upstream/references/shots/typography/type-assembly-moves.md +45 -45
- package/lib/motion/shotcraft/upstream/references/shots/typography/type-entrance-moves.md +41 -41
- package/lib/motion/shotcraft/upstream/references/shots/typography/type-rhythm-sync.md +51 -51
- package/lib/motion/shotcraft/upstream/references/shots/typography/typewriter-moves.md +42 -42
- package/lib/motion/shotcraft/upstream/references/shots/typography/vertical-word-roll-blur-cycle.md +63 -63
- package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-filmstrip.md +57 -57
- package/lib/motion/shotcraft/upstream/references/shots/typography/word-relay-geometry.md +75 -75
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/avatar-bracket-carousel.md +59 -59
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/bezier-source-converge-merge.md +67 -67
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/card-stack.md +60 -60
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/carousel-3d.md +66 -66
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/cloner-depth-echo.md +40 -40
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/deck-deal-flyin.md +45 -45
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/doc-park-left-pill-deal.md +62 -62
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/draw-svg-trace.md +55 -55
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/element-body-moves.md +37 -37
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/integration-hub-map.md +55 -55
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-reveal.md +50 -50
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/list-stack-press.md +43 -43
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-forerun.md +55 -55
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/neon-frame-orbit-drop.md +51 -51
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/page-waterfall-wall.md +51 -51
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/product-card-progressive-assemble.md +56 -56
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/radial-wave.md +49 -49
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/research-card-stack-scroll.md +57 -57
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/row-embed.md +36 -36
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/value-stagger-gradient.md +64 -64
- package/lib/motion/shotcraft/upstream/references/shots/ui-entrance/wall-reveal-moves.md +47 -47
- package/lib/motion/shotcraft/upstream/references/sound-design.md +170 -170
- package/lib/motion/shotcraft/upstream/references/workbench.md +157 -157
- package/lib/motion/shotcraft/upstream/template/TEMPLATE.md +103 -103
- package/lib/motion/shotcraft/upstream/template/THEMES.md +44 -44
- package/lib/motion/shotcraft/upstream/template/package.json +20 -20
- package/lib/motion/shotcraft/upstream/template/remotion.config.ts +6 -6
- package/lib/motion/shotcraft/upstream/template/src/Root.tsx +17 -17
- package/lib/motion/shotcraft/upstream/template/src/aifl/Caption.tsx +65 -65
- package/lib/motion/shotcraft/upstream/template/src/aifl/DigitRoll.tsx +48 -48
- package/lib/motion/shotcraft/upstream/template/src/aifl/FlashCut.tsx +24 -24
- package/lib/motion/shotcraft/upstream/template/src/aifl/Main.tsx +192 -192
- package/lib/motion/shotcraft/upstream/template/src/aifl/PaperTitleCard.tsx +111 -111
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/PageCam.tsx +150 -150
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneDetail.tsx +158 -158
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneFlyIn.tsx +468 -468
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOpen.tsx +552 -552
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneOutroLive.tsx +411 -411
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/ScenePapers.tsx +200 -200
- package/lib/motion/shotcraft/upstream/template/src/aifl/live/SceneWbr.tsx +324 -324
- package/lib/motion/shotcraft/upstream/template/src/aifl/live-layout.json +388 -388
- package/lib/motion/shotcraft/upstream/template/src/index.ts +4 -4
- package/lib/motion/shotcraft/upstream/template/src/themes/ThemedFilm.tsx +7 -7
- package/lib/motion/shotcraft/upstream/template/src/themes/manifest.tsx +68 -68
- package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.json +1 -1
- package/lib/motion/shotcraft/upstream/template/src/themes/palette-assets.ts +24 -24
- package/lib/motion/shotcraft/upstream/template/src/themes/palettes.json +74 -74
- package/lib/motion/shotcraft/upstream/template/src/themes/visual-theme.tsx +91 -91
- package/lib/motion/shotcraft/upstream/template/src/workbench.ts +213 -213
- package/lib/motion/shotcraft/upstream/template/tsconfig.json +15 -15
- package/lib/motion/style-frames.js +306 -306
- package/lib/motion/sync.js +214 -214
- package/lib/motion-library.js +1 -1
- package/lib/motion-project.js +105 -105
- package/lib/motion-render-worker.js +174 -174
- package/lib/routing/router.js +222 -222
- package/lib/routing/vendor/README.md +96 -96
- package/lib/routing/vendor/libavoid-routing.js +753 -753
- package/lib/routing/vendor/libavoid.min.js +59 -59
- package/lib/svg-export.js +1344 -0
- package/lib/video-trace-pool.js +128 -128
- package/package.json +3 -2
- package/LICENSE +0 -4175
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
// origin: template/src/aifl/Caption.tsx(模板片同源组件)
|
|
2
|
-
import { interpolate, useCurrentFrame } from 'remotion';
|
|
3
|
-
|
|
4
|
-
const MONO = 'ui-monospace, SFMono-Regular, Menlo, monospace';
|
|
5
|
-
const AMBER = 'oklch(52% 0.115 65)';
|
|
6
|
-
|
|
7
|
-
/** Screen-space narration caption: a mono UI info-strip at the bottom of the
|
|
8
|
-
* frame, led by a small amber square. Fades/rises in over 8 frames and fades
|
|
9
|
-
* out over the last 8 of its window.
|
|
10
|
-
*
|
|
11
|
-
* 注意:22px 属"信息条"风格(大字距全大写作补偿),低于审美准则 Q11 的
|
|
12
|
-
* 字幕线(≥56px)。作为叙事主字幕使用时应提到 56–60px 档或改用大字幕组件;
|
|
13
|
-
* 沿用 22px 信息条风格属于 Q11 允许的有意识违反,需在项目说明中注明。 */
|
|
14
|
-
export const Caption: React.FC<{ text: string; duration: number; bottom?: number }> = ({
|
|
15
|
-
text,
|
|
16
|
-
duration,
|
|
17
|
-
bottom = 72,
|
|
18
|
-
}) => {
|
|
19
|
-
const frame = useCurrentFrame();
|
|
20
|
-
const inT = interpolate(frame, [0, 8], [0, 1], {
|
|
21
|
-
extrapolateLeft: 'clamp',
|
|
22
|
-
extrapolateRight: 'clamp',
|
|
23
|
-
});
|
|
24
|
-
const outT = interpolate(frame, [duration - 8, duration], [1, 0], {
|
|
25
|
-
extrapolateLeft: 'clamp',
|
|
26
|
-
extrapolateRight: 'clamp',
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
return (
|
|
30
|
-
<div
|
|
31
|
-
style={{
|
|
32
|
-
position: 'absolute',
|
|
33
|
-
left: 0,
|
|
34
|
-
right: 0,
|
|
35
|
-
bottom,
|
|
36
|
-
display: 'flex',
|
|
37
|
-
justifyContent: 'center',
|
|
38
|
-
alignItems: 'baseline',
|
|
39
|
-
gap: 14,
|
|
40
|
-
fontFamily: MONO,
|
|
41
|
-
fontSize: 22,
|
|
42
|
-
letterSpacing: '0.14em',
|
|
43
|
-
textTransform: 'uppercase',
|
|
44
|
-
color: 'oklch(45% 0.006 82)',
|
|
45
|
-
opacity: inT * outT,
|
|
46
|
-
transform: `translateY(${(1 - inT) * 8}px)`,
|
|
47
|
-
pointerEvents: 'none',
|
|
48
|
-
}}
|
|
49
|
-
>
|
|
50
|
-
<span style={{ width: 6, height: 6, background: AMBER, display: 'inline-block' }} />
|
|
51
|
-
<span>{text}</span>
|
|
52
|
-
</div>
|
|
53
|
-
);
|
|
54
|
-
};
|
|
1
|
+
// origin: template/src/aifl/Caption.tsx(模板片同源组件)
|
|
2
|
+
import { interpolate, useCurrentFrame } from 'remotion';
|
|
3
|
+
|
|
4
|
+
const MONO = 'ui-monospace, SFMono-Regular, Menlo, monospace';
|
|
5
|
+
const AMBER = 'oklch(52% 0.115 65)';
|
|
6
|
+
|
|
7
|
+
/** Screen-space narration caption: a mono UI info-strip at the bottom of the
|
|
8
|
+
* frame, led by a small amber square. Fades/rises in over 8 frames and fades
|
|
9
|
+
* out over the last 8 of its window.
|
|
10
|
+
*
|
|
11
|
+
* 注意:22px 属"信息条"风格(大字距全大写作补偿),低于审美准则 Q11 的
|
|
12
|
+
* 字幕线(≥56px)。作为叙事主字幕使用时应提到 56–60px 档或改用大字幕组件;
|
|
13
|
+
* 沿用 22px 信息条风格属于 Q11 允许的有意识违反,需在项目说明中注明。 */
|
|
14
|
+
export const Caption: React.FC<{ text: string; duration: number; bottom?: number }> = ({
|
|
15
|
+
text,
|
|
16
|
+
duration,
|
|
17
|
+
bottom = 72,
|
|
18
|
+
}) => {
|
|
19
|
+
const frame = useCurrentFrame();
|
|
20
|
+
const inT = interpolate(frame, [0, 8], [0, 1], {
|
|
21
|
+
extrapolateLeft: 'clamp',
|
|
22
|
+
extrapolateRight: 'clamp',
|
|
23
|
+
});
|
|
24
|
+
const outT = interpolate(frame, [duration - 8, duration], [1, 0], {
|
|
25
|
+
extrapolateLeft: 'clamp',
|
|
26
|
+
extrapolateRight: 'clamp',
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<div
|
|
31
|
+
style={{
|
|
32
|
+
position: 'absolute',
|
|
33
|
+
left: 0,
|
|
34
|
+
right: 0,
|
|
35
|
+
bottom,
|
|
36
|
+
display: 'flex',
|
|
37
|
+
justifyContent: 'center',
|
|
38
|
+
alignItems: 'baseline',
|
|
39
|
+
gap: 14,
|
|
40
|
+
fontFamily: MONO,
|
|
41
|
+
fontSize: 22,
|
|
42
|
+
letterSpacing: '0.14em',
|
|
43
|
+
textTransform: 'uppercase',
|
|
44
|
+
color: 'oklch(45% 0.006 82)',
|
|
45
|
+
opacity: inT * outT,
|
|
46
|
+
transform: `translateY(${(1 - inT) * 8}px)`,
|
|
47
|
+
pointerEvents: 'none',
|
|
48
|
+
}}
|
|
49
|
+
>
|
|
50
|
+
<span style={{ width: 6, height: 6, background: AMBER, display: 'inline-block' }} />
|
|
51
|
+
<span>{text}</span>
|
|
52
|
+
</div>
|
|
53
|
+
);
|
|
54
|
+
};
|
|
@@ -1,200 +1,200 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
OffthreadVideo,
|
|
4
|
-
Sequence,
|
|
5
|
-
interpolate,
|
|
6
|
-
staticFile,
|
|
7
|
-
useCurrentFrame,
|
|
8
|
-
useVideoConfig,
|
|
9
|
-
} from 'remotion';
|
|
10
|
-
|
|
11
|
-
// ClipCard — wraps an external video clip (mp4) into a "card hero" that shot
|
|
12
|
-
// recipes designed for DOM/SVG subjects (spotlight-hero-card,
|
|
13
|
-
// magician-card-flourish, neon-frame-orbit-drop, quad-split-parallel-scenes…)
|
|
14
|
-
// can drive directly. Fills the library gap where every card assumes generated
|
|
15
|
-
// DOM content or page screenshots, never real footage.
|
|
16
|
-
//
|
|
17
|
-
// Battle-tested in a delivered 39s promo (spotlight push-in at zoom 1.7 on a
|
|
18
|
-
// 512×512 clip; 3-up quad-split with 32px captions after a Q11 readability
|
|
19
|
-
// review finding — small cards need captionSize raised to keep ≥32px on-screen).
|
|
20
|
-
//
|
|
21
|
-
// Crossfade loop: OffthreadVideo (as of 4.0.484) has no `loop` prop and freezes
|
|
22
|
-
// past media end. Pass `loopDurationInFrames` to enable a seamless dissolve
|
|
23
|
-
// loop — each next pass fades in over the previous tail. The effective step is
|
|
24
|
-
// `loopDurationInFrames - startFrom` (a `startFrom` trim shortens the playable
|
|
25
|
-
// media), and layer count is derived from the enclosing shot's duration, not
|
|
26
|
-
// the Composition's, so a short shot inside a long composition doesn't spawn
|
|
27
|
-
// invisible layers. Layer audio is crossfaded with complementary `volume`
|
|
28
|
-
// curves so an unmuted loop doesn't stack two full-volume tracks.
|
|
29
|
-
|
|
30
|
-
const ACCENT = '#4da3ff';
|
|
31
|
-
|
|
32
|
-
// Each loop layer crossfades BOTH its audio and its opacity at its edges:
|
|
33
|
-
// an incoming fade 0→1 over `fadeIn` frames at the layer start, a steady body,
|
|
34
|
-
// then an outgoing fade 1→0 over `fadeOut` frames ending at `step` — the frame
|
|
35
|
-
// where the NEXT layer starts. Adjacent layers therefore overlap for exactly
|
|
36
|
-
// `crossfade` frames and their envelopes are complementary (sum to 1), so an
|
|
37
|
-
// unmuted loop never stacks two full-volume tracks; visual dissolve and audio
|
|
38
|
-
// crossfade stay in sync since they share the same envelope.
|
|
39
|
-
const LoopLayer: React.FC<{
|
|
40
|
-
src: string;
|
|
41
|
-
size: number;
|
|
42
|
-
muted: boolean;
|
|
43
|
-
startFrom: number;
|
|
44
|
-
fadeIn: number;
|
|
45
|
-
fadeOut: number;
|
|
46
|
-
step: number;
|
|
47
|
-
}> = ({ src, size, muted, startFrom, fadeIn, fadeOut, step }) => {
|
|
48
|
-
const frame = useCurrentFrame();
|
|
49
|
-
|
|
50
|
-
// envelope(f): 0 at f=0 (unless fadeIn=0 → 1), 1 through the body, 0 at
|
|
51
|
-
// f=step+fadeOut. Adjacent layers are spaced `step` apart and each fades
|
|
52
|
-
// out over `fadeOut` into the next one's `fadeIn` window.
|
|
53
|
-
let envelope: number;
|
|
54
|
-
if (frame <= fadeIn) {
|
|
55
|
-
envelope = fadeIn === 0 ? 1 : interpolate(frame, [0, fadeIn], [0, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
|
|
56
|
-
} else if (frame <= step) {
|
|
57
|
-
envelope = 1;
|
|
58
|
-
} else {
|
|
59
|
-
envelope = interpolate(frame, [step, step + fadeOut], [1, 0], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const opacity = Math.max(0, Math.min(1, envelope));
|
|
63
|
-
const volume = muted ? 1 : opacity;
|
|
64
|
-
|
|
65
|
-
return (
|
|
66
|
-
<OffthreadVideo
|
|
67
|
-
src={staticFile(src)}
|
|
68
|
-
muted={muted}
|
|
69
|
-
volume={volume}
|
|
70
|
-
startFrom={startFrom}
|
|
71
|
-
style={{
|
|
72
|
-
position: 'absolute',
|
|
73
|
-
inset: 0,
|
|
74
|
-
width: size,
|
|
75
|
-
height: size,
|
|
76
|
-
objectFit: 'cover',
|
|
77
|
-
opacity,
|
|
78
|
-
}}
|
|
79
|
-
/>
|
|
80
|
-
);
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
export const ClipCard: React.FC<{
|
|
84
|
-
src: string; // path under public/
|
|
85
|
-
caption?: string; // monospace caption bar under the clip
|
|
86
|
-
size?: number; // card edge (square clips)
|
|
87
|
-
radius?: number;
|
|
88
|
-
muted?: boolean;
|
|
89
|
-
captionSize?: number; // default 17 — raise on small/far cards to keep ≥32px on-screen text
|
|
90
|
-
startFrom?: number; // trim: play the clip from this frame
|
|
91
|
-
style?: React.CSSProperties;
|
|
92
|
-
loopDurationInFrames?: number; // playable clip length in comp frames → enables crossfade loop
|
|
93
|
-
loopCrossfadeInFrames?: number; // default 8
|
|
94
|
-
durationInFrames?: number; // enclosing shot duration — loop layer count is derived from this,
|
|
95
|
-
// not the Composition duration (a short shot in a long composition)
|
|
96
|
-
}> = ({
|
|
97
|
-
src,
|
|
98
|
-
caption,
|
|
99
|
-
size = 560,
|
|
100
|
-
radius = 20,
|
|
101
|
-
muted = true,
|
|
102
|
-
startFrom = 0,
|
|
103
|
-
style,
|
|
104
|
-
captionSize = 17,
|
|
105
|
-
loopDurationInFrames,
|
|
106
|
-
loopCrossfadeInFrames = 8,
|
|
107
|
-
durationInFrames,
|
|
108
|
-
}) => {
|
|
109
|
-
const { durationInFrames: compDuration } = useVideoConfig();
|
|
110
|
-
const capH = caption ? Math.round(captionSize * 2.6) : 0;
|
|
111
|
-
|
|
112
|
-
let video: React.ReactNode;
|
|
113
|
-
// Guard: a startFrom trim that reaches or exceeds the playable media (or any
|
|
114
|
-
// degenerate step) must NOT loop — falling back to a plain single pass keeps
|
|
115
|
-
// a visible, audible clip instead of a layer that instantly fades to 0.
|
|
116
|
-
// step must also be >= crossfade, else >2 layers overlap at once and the
|
|
117
|
-
// complementary envelopes no longer sum to 1 (visual/audio stack past full).
|
|
118
|
-
const step = loopDurationInFrames
|
|
119
|
-
? loopDurationInFrames - startFrom - loopCrossfadeInFrames
|
|
120
|
-
: 0;
|
|
121
|
-
const canLoop =
|
|
122
|
-
!!loopDurationInFrames &&
|
|
123
|
-
loopDurationInFrames > loopCrossfadeInFrames &&
|
|
124
|
-
step >= loopCrossfadeInFrames;
|
|
125
|
-
if (canLoop) {
|
|
126
|
-
const shotFrames = durationInFrames ?? compDuration;
|
|
127
|
-
const n = Math.max(1, Math.ceil(shotFrames / step));
|
|
128
|
-
video = (
|
|
129
|
-
<div style={{ position: 'relative', width: size, height: size }}>
|
|
130
|
-
{Array.from({ length: n }, (_, i) => (
|
|
131
|
-
<Sequence
|
|
132
|
-
key={i}
|
|
133
|
-
from={i * step}
|
|
134
|
-
durationInFrames={loopDurationInFrames}
|
|
135
|
-
layout="none"
|
|
136
|
-
>
|
|
137
|
-
<LoopLayer
|
|
138
|
-
src={src}
|
|
139
|
-
size={size}
|
|
140
|
-
muted={muted}
|
|
141
|
-
startFrom={startFrom}
|
|
142
|
-
fadeIn={i === 0 ? 0 : loopCrossfadeInFrames}
|
|
143
|
-
fadeOut={loopCrossfadeInFrames}
|
|
144
|
-
step={step}
|
|
145
|
-
/>
|
|
146
|
-
</Sequence>
|
|
147
|
-
))}
|
|
148
|
-
</div>
|
|
149
|
-
);
|
|
150
|
-
} else {
|
|
151
|
-
video = (
|
|
152
|
-
<OffthreadVideo
|
|
153
|
-
src={staticFile(src)}
|
|
154
|
-
muted={muted}
|
|
155
|
-
startFrom={startFrom}
|
|
156
|
-
style={{
|
|
157
|
-
width: size,
|
|
158
|
-
height: size,
|
|
159
|
-
objectFit: 'cover',
|
|
160
|
-
display: 'block',
|
|
161
|
-
}}
|
|
162
|
-
/>
|
|
163
|
-
);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return (
|
|
167
|
-
<div
|
|
168
|
-
style={{
|
|
169
|
-
width: size,
|
|
170
|
-
height: size + capH,
|
|
171
|
-
borderRadius: radius,
|
|
172
|
-
background: '#111116',
|
|
173
|
-
border: '1px solid rgba(255,255,255,0.10)',
|
|
174
|
-
boxShadow: '0 24px 80px rgba(0,0,0,0.55)',
|
|
175
|
-
overflow: 'hidden',
|
|
176
|
-
...style,
|
|
177
|
-
}}
|
|
178
|
-
>
|
|
179
|
-
{video}
|
|
180
|
-
{caption ? (
|
|
181
|
-
<div
|
|
182
|
-
style={{
|
|
183
|
-
height: capH,
|
|
184
|
-
display: 'flex',
|
|
185
|
-
alignItems: 'center',
|
|
186
|
-
padding: '0 18px',
|
|
187
|
-
fontFamily: 'ui-monospace, Menlo, monospace',
|
|
188
|
-
fontSize: captionSize,
|
|
189
|
-
color: 'rgba(255,255,255,0.72)',
|
|
190
|
-
letterSpacing: 0.5,
|
|
191
|
-
borderTop: '1px solid rgba(255,255,255,0.10)',
|
|
192
|
-
}}
|
|
193
|
-
>
|
|
194
|
-
<span style={{ color: ACCENT, marginRight: 10 }}>▸</span>
|
|
195
|
-
{caption}
|
|
196
|
-
</div>
|
|
197
|
-
) : null}
|
|
198
|
-
</div>
|
|
199
|
-
);
|
|
200
|
-
};
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
OffthreadVideo,
|
|
4
|
+
Sequence,
|
|
5
|
+
interpolate,
|
|
6
|
+
staticFile,
|
|
7
|
+
useCurrentFrame,
|
|
8
|
+
useVideoConfig,
|
|
9
|
+
} from 'remotion';
|
|
10
|
+
|
|
11
|
+
// ClipCard — wraps an external video clip (mp4) into a "card hero" that shot
|
|
12
|
+
// recipes designed for DOM/SVG subjects (spotlight-hero-card,
|
|
13
|
+
// magician-card-flourish, neon-frame-orbit-drop, quad-split-parallel-scenes…)
|
|
14
|
+
// can drive directly. Fills the library gap where every card assumes generated
|
|
15
|
+
// DOM content or page screenshots, never real footage.
|
|
16
|
+
//
|
|
17
|
+
// Battle-tested in a delivered 39s promo (spotlight push-in at zoom 1.7 on a
|
|
18
|
+
// 512×512 clip; 3-up quad-split with 32px captions after a Q11 readability
|
|
19
|
+
// review finding — small cards need captionSize raised to keep ≥32px on-screen).
|
|
20
|
+
//
|
|
21
|
+
// Crossfade loop: OffthreadVideo (as of 4.0.484) has no `loop` prop and freezes
|
|
22
|
+
// past media end. Pass `loopDurationInFrames` to enable a seamless dissolve
|
|
23
|
+
// loop — each next pass fades in over the previous tail. The effective step is
|
|
24
|
+
// `loopDurationInFrames - startFrom` (a `startFrom` trim shortens the playable
|
|
25
|
+
// media), and layer count is derived from the enclosing shot's duration, not
|
|
26
|
+
// the Composition's, so a short shot inside a long composition doesn't spawn
|
|
27
|
+
// invisible layers. Layer audio is crossfaded with complementary `volume`
|
|
28
|
+
// curves so an unmuted loop doesn't stack two full-volume tracks.
|
|
29
|
+
|
|
30
|
+
const ACCENT = '#4da3ff';
|
|
31
|
+
|
|
32
|
+
// Each loop layer crossfades BOTH its audio and its opacity at its edges:
|
|
33
|
+
// an incoming fade 0→1 over `fadeIn` frames at the layer start, a steady body,
|
|
34
|
+
// then an outgoing fade 1→0 over `fadeOut` frames ending at `step` — the frame
|
|
35
|
+
// where the NEXT layer starts. Adjacent layers therefore overlap for exactly
|
|
36
|
+
// `crossfade` frames and their envelopes are complementary (sum to 1), so an
|
|
37
|
+
// unmuted loop never stacks two full-volume tracks; visual dissolve and audio
|
|
38
|
+
// crossfade stay in sync since they share the same envelope.
|
|
39
|
+
const LoopLayer: React.FC<{
|
|
40
|
+
src: string;
|
|
41
|
+
size: number;
|
|
42
|
+
muted: boolean;
|
|
43
|
+
startFrom: number;
|
|
44
|
+
fadeIn: number;
|
|
45
|
+
fadeOut: number;
|
|
46
|
+
step: number;
|
|
47
|
+
}> = ({ src, size, muted, startFrom, fadeIn, fadeOut, step }) => {
|
|
48
|
+
const frame = useCurrentFrame();
|
|
49
|
+
|
|
50
|
+
// envelope(f): 0 at f=0 (unless fadeIn=0 → 1), 1 through the body, 0 at
|
|
51
|
+
// f=step+fadeOut. Adjacent layers are spaced `step` apart and each fades
|
|
52
|
+
// out over `fadeOut` into the next one's `fadeIn` window.
|
|
53
|
+
let envelope: number;
|
|
54
|
+
if (frame <= fadeIn) {
|
|
55
|
+
envelope = fadeIn === 0 ? 1 : interpolate(frame, [0, fadeIn], [0, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
|
|
56
|
+
} else if (frame <= step) {
|
|
57
|
+
envelope = 1;
|
|
58
|
+
} else {
|
|
59
|
+
envelope = interpolate(frame, [step, step + fadeOut], [1, 0], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const opacity = Math.max(0, Math.min(1, envelope));
|
|
63
|
+
const volume = muted ? 1 : opacity;
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<OffthreadVideo
|
|
67
|
+
src={staticFile(src)}
|
|
68
|
+
muted={muted}
|
|
69
|
+
volume={volume}
|
|
70
|
+
startFrom={startFrom}
|
|
71
|
+
style={{
|
|
72
|
+
position: 'absolute',
|
|
73
|
+
inset: 0,
|
|
74
|
+
width: size,
|
|
75
|
+
height: size,
|
|
76
|
+
objectFit: 'cover',
|
|
77
|
+
opacity,
|
|
78
|
+
}}
|
|
79
|
+
/>
|
|
80
|
+
);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const ClipCard: React.FC<{
|
|
84
|
+
src: string; // path under public/
|
|
85
|
+
caption?: string; // monospace caption bar under the clip
|
|
86
|
+
size?: number; // card edge (square clips)
|
|
87
|
+
radius?: number;
|
|
88
|
+
muted?: boolean;
|
|
89
|
+
captionSize?: number; // default 17 — raise on small/far cards to keep ≥32px on-screen text
|
|
90
|
+
startFrom?: number; // trim: play the clip from this frame
|
|
91
|
+
style?: React.CSSProperties;
|
|
92
|
+
loopDurationInFrames?: number; // playable clip length in comp frames → enables crossfade loop
|
|
93
|
+
loopCrossfadeInFrames?: number; // default 8
|
|
94
|
+
durationInFrames?: number; // enclosing shot duration — loop layer count is derived from this,
|
|
95
|
+
// not the Composition duration (a short shot in a long composition)
|
|
96
|
+
}> = ({
|
|
97
|
+
src,
|
|
98
|
+
caption,
|
|
99
|
+
size = 560,
|
|
100
|
+
radius = 20,
|
|
101
|
+
muted = true,
|
|
102
|
+
startFrom = 0,
|
|
103
|
+
style,
|
|
104
|
+
captionSize = 17,
|
|
105
|
+
loopDurationInFrames,
|
|
106
|
+
loopCrossfadeInFrames = 8,
|
|
107
|
+
durationInFrames,
|
|
108
|
+
}) => {
|
|
109
|
+
const { durationInFrames: compDuration } = useVideoConfig();
|
|
110
|
+
const capH = caption ? Math.round(captionSize * 2.6) : 0;
|
|
111
|
+
|
|
112
|
+
let video: React.ReactNode;
|
|
113
|
+
// Guard: a startFrom trim that reaches or exceeds the playable media (or any
|
|
114
|
+
// degenerate step) must NOT loop — falling back to a plain single pass keeps
|
|
115
|
+
// a visible, audible clip instead of a layer that instantly fades to 0.
|
|
116
|
+
// step must also be >= crossfade, else >2 layers overlap at once and the
|
|
117
|
+
// complementary envelopes no longer sum to 1 (visual/audio stack past full).
|
|
118
|
+
const step = loopDurationInFrames
|
|
119
|
+
? loopDurationInFrames - startFrom - loopCrossfadeInFrames
|
|
120
|
+
: 0;
|
|
121
|
+
const canLoop =
|
|
122
|
+
!!loopDurationInFrames &&
|
|
123
|
+
loopDurationInFrames > loopCrossfadeInFrames &&
|
|
124
|
+
step >= loopCrossfadeInFrames;
|
|
125
|
+
if (canLoop) {
|
|
126
|
+
const shotFrames = durationInFrames ?? compDuration;
|
|
127
|
+
const n = Math.max(1, Math.ceil(shotFrames / step));
|
|
128
|
+
video = (
|
|
129
|
+
<div style={{ position: 'relative', width: size, height: size }}>
|
|
130
|
+
{Array.from({ length: n }, (_, i) => (
|
|
131
|
+
<Sequence
|
|
132
|
+
key={i}
|
|
133
|
+
from={i * step}
|
|
134
|
+
durationInFrames={loopDurationInFrames}
|
|
135
|
+
layout="none"
|
|
136
|
+
>
|
|
137
|
+
<LoopLayer
|
|
138
|
+
src={src}
|
|
139
|
+
size={size}
|
|
140
|
+
muted={muted}
|
|
141
|
+
startFrom={startFrom}
|
|
142
|
+
fadeIn={i === 0 ? 0 : loopCrossfadeInFrames}
|
|
143
|
+
fadeOut={loopCrossfadeInFrames}
|
|
144
|
+
step={step}
|
|
145
|
+
/>
|
|
146
|
+
</Sequence>
|
|
147
|
+
))}
|
|
148
|
+
</div>
|
|
149
|
+
);
|
|
150
|
+
} else {
|
|
151
|
+
video = (
|
|
152
|
+
<OffthreadVideo
|
|
153
|
+
src={staticFile(src)}
|
|
154
|
+
muted={muted}
|
|
155
|
+
startFrom={startFrom}
|
|
156
|
+
style={{
|
|
157
|
+
width: size,
|
|
158
|
+
height: size,
|
|
159
|
+
objectFit: 'cover',
|
|
160
|
+
display: 'block',
|
|
161
|
+
}}
|
|
162
|
+
/>
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return (
|
|
167
|
+
<div
|
|
168
|
+
style={{
|
|
169
|
+
width: size,
|
|
170
|
+
height: size + capH,
|
|
171
|
+
borderRadius: radius,
|
|
172
|
+
background: '#111116',
|
|
173
|
+
border: '1px solid rgba(255,255,255,0.10)',
|
|
174
|
+
boxShadow: '0 24px 80px rgba(0,0,0,0.55)',
|
|
175
|
+
overflow: 'hidden',
|
|
176
|
+
...style,
|
|
177
|
+
}}
|
|
178
|
+
>
|
|
179
|
+
{video}
|
|
180
|
+
{caption ? (
|
|
181
|
+
<div
|
|
182
|
+
style={{
|
|
183
|
+
height: capH,
|
|
184
|
+
display: 'flex',
|
|
185
|
+
alignItems: 'center',
|
|
186
|
+
padding: '0 18px',
|
|
187
|
+
fontFamily: 'ui-monospace, Menlo, monospace',
|
|
188
|
+
fontSize: captionSize,
|
|
189
|
+
color: 'rgba(255,255,255,0.72)',
|
|
190
|
+
letterSpacing: 0.5,
|
|
191
|
+
borderTop: '1px solid rgba(255,255,255,0.10)',
|
|
192
|
+
}}
|
|
193
|
+
>
|
|
194
|
+
<span style={{ color: ACCENT, marginRight: 10 }}>▸</span>
|
|
195
|
+
{caption}
|
|
196
|
+
</div>
|
|
197
|
+
) : null}
|
|
198
|
+
</div>
|
|
199
|
+
);
|
|
200
|
+
};
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
// origin: template/src/aifl/DigitRoll.tsx(模板片同源组件)
|
|
2
|
-
import { interpolate, useCurrentFrame, Easing } from 'remotion';
|
|
3
|
-
|
|
4
|
-
const DIGITS = '0123456789';
|
|
5
|
-
|
|
6
|
-
/** Odometer-style digit column roll for monospace numerals. */
|
|
7
|
-
export const DigitRoll: React.FC<{
|
|
8
|
-
value: string;
|
|
9
|
-
delay?: number;
|
|
10
|
-
fontSize?: number;
|
|
11
|
-
color?: string;
|
|
12
|
-
}> = ({ value, delay = 0, fontSize = 30, color = 'oklch(52% 0.115 65)' }) => {
|
|
13
|
-
const frame = useCurrentFrame();
|
|
14
|
-
const lineH = fontSize * 1.15;
|
|
15
|
-
return (
|
|
16
|
-
<span style={{ display: 'inline-flex', overflow: 'hidden', height: lineH, verticalAlign: 'bottom' }}>
|
|
17
|
-
{value.split('').map((ch, i) => {
|
|
18
|
-
const target = DIGITS.indexOf(ch);
|
|
19
|
-
if (target < 0) {
|
|
20
|
-
return (
|
|
21
|
-
<span key={i} style={{ fontSize, lineHeight: `${lineH}px`, color }}>{ch}</span>
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
const t = interpolate(frame, [delay + i * 4, delay + i * 4 + 22], [0, 1], {
|
|
25
|
-
extrapolateLeft: 'clamp',
|
|
26
|
-
extrapolateRight: 'clamp',
|
|
27
|
-
easing: Easing.bezier(0.25, 0.8, 0.25, 1),
|
|
28
|
-
});
|
|
29
|
-
// roll through one full strip then land on the target digit
|
|
30
|
-
const offset = (10 + target) * t * lineH;
|
|
31
|
-
return (
|
|
32
|
-
<span key={i} style={{ display: 'inline-block', height: lineH }}>
|
|
33
|
-
<span style={{ display: 'block', transform: `translateY(${-offset}px)` }}>
|
|
34
|
-
{(DIGITS + DIGITS).split('').map((d, j) => (
|
|
35
|
-
<span key={j} style={{ display: 'block', fontSize, lineHeight: `${lineH}px`, color, fontVariantNumeric: 'tabular-nums' }}>
|
|
36
|
-
{d}
|
|
37
|
-
</span>
|
|
38
|
-
))}
|
|
39
|
-
</span>
|
|
40
|
-
</span>
|
|
41
|
-
);
|
|
42
|
-
})}
|
|
43
|
-
</span>
|
|
44
|
-
);
|
|
45
|
-
};
|
|
1
|
+
// origin: template/src/aifl/DigitRoll.tsx(模板片同源组件)
|
|
2
|
+
import { interpolate, useCurrentFrame, Easing } from 'remotion';
|
|
3
|
+
|
|
4
|
+
const DIGITS = '0123456789';
|
|
5
|
+
|
|
6
|
+
/** Odometer-style digit column roll for monospace numerals. */
|
|
7
|
+
export const DigitRoll: React.FC<{
|
|
8
|
+
value: string;
|
|
9
|
+
delay?: number;
|
|
10
|
+
fontSize?: number;
|
|
11
|
+
color?: string;
|
|
12
|
+
}> = ({ value, delay = 0, fontSize = 30, color = 'oklch(52% 0.115 65)' }) => {
|
|
13
|
+
const frame = useCurrentFrame();
|
|
14
|
+
const lineH = fontSize * 1.15;
|
|
15
|
+
return (
|
|
16
|
+
<span style={{ display: 'inline-flex', overflow: 'hidden', height: lineH, verticalAlign: 'bottom' }}>
|
|
17
|
+
{value.split('').map((ch, i) => {
|
|
18
|
+
const target = DIGITS.indexOf(ch);
|
|
19
|
+
if (target < 0) {
|
|
20
|
+
return (
|
|
21
|
+
<span key={i} style={{ fontSize, lineHeight: `${lineH}px`, color }}>{ch}</span>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
const t = interpolate(frame, [delay + i * 4, delay + i * 4 + 22], [0, 1], {
|
|
25
|
+
extrapolateLeft: 'clamp',
|
|
26
|
+
extrapolateRight: 'clamp',
|
|
27
|
+
easing: Easing.bezier(0.25, 0.8, 0.25, 1),
|
|
28
|
+
});
|
|
29
|
+
// roll through one full strip then land on the target digit
|
|
30
|
+
const offset = (10 + target) * t * lineH;
|
|
31
|
+
return (
|
|
32
|
+
<span key={i} style={{ display: 'inline-block', height: lineH }}>
|
|
33
|
+
<span style={{ display: 'block', transform: `translateY(${-offset}px)` }}>
|
|
34
|
+
{(DIGITS + DIGITS).split('').map((d, j) => (
|
|
35
|
+
<span key={j} style={{ display: 'block', fontSize, lineHeight: `${lineH}px`, color, fontVariantNumeric: 'tabular-nums' }}>
|
|
36
|
+
{d}
|
|
37
|
+
</span>
|
|
38
|
+
))}
|
|
39
|
+
</span>
|
|
40
|
+
</span>
|
|
41
|
+
);
|
|
42
|
+
})}
|
|
43
|
+
</span>
|
|
44
|
+
);
|
|
45
|
+
};
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
// origin: template/src/aifl/FlashCut.tsx(模板片同源组件)
|
|
2
|
-
import { AbsoluteFill, interpolate, useCurrentFrame } from 'remotion';
|
|
3
|
-
|
|
4
|
-
/** Bright-field cut: a warm-white bloom that flashes over the hard cut. */
|
|
5
|
-
export const FlashCut: React.FC<{ duration?: number }> = ({ duration = 10 }) => {
|
|
6
|
-
const frame = useCurrentFrame();
|
|
7
|
-
const o = interpolate(frame, [0, duration * 0.4, duration], [0, 0.85, 0], {
|
|
8
|
-
extrapolateLeft: 'clamp',
|
|
9
|
-
extrapolateRight: 'clamp',
|
|
10
|
-
});
|
|
11
|
-
return (
|
|
12
|
-
<AbsoluteFill
|
|
13
|
-
style={{
|
|
14
|
-
pointerEvents: 'none',
|
|
15
|
-
opacity: o,
|
|
16
|
-
background: 'radial-gradient(ellipse at 50% 45%, rgba(255,248,235,0.98), rgba(255,244,224,0.55) 55%, transparent 80%)',
|
|
17
|
-
}}
|
|
18
|
-
/>
|
|
19
|
-
);
|
|
20
|
-
};
|
|
1
|
+
// origin: template/src/aifl/FlashCut.tsx(模板片同源组件)
|
|
2
|
+
import { AbsoluteFill, interpolate, useCurrentFrame } from 'remotion';
|
|
3
|
+
|
|
4
|
+
/** Bright-field cut: a warm-white bloom that flashes over the hard cut. */
|
|
5
|
+
export const FlashCut: React.FC<{ duration?: number }> = ({ duration = 10 }) => {
|
|
6
|
+
const frame = useCurrentFrame();
|
|
7
|
+
const o = interpolate(frame, [0, duration * 0.4, duration], [0, 0.85, 0], {
|
|
8
|
+
extrapolateLeft: 'clamp',
|
|
9
|
+
extrapolateRight: 'clamp',
|
|
10
|
+
});
|
|
11
|
+
return (
|
|
12
|
+
<AbsoluteFill
|
|
13
|
+
style={{
|
|
14
|
+
pointerEvents: 'none',
|
|
15
|
+
opacity: o,
|
|
16
|
+
background: 'radial-gradient(ellipse at 50% 45%, rgba(255,248,235,0.98), rgba(255,244,224,0.55) 55%, transparent 80%)',
|
|
17
|
+
}}
|
|
18
|
+
/>
|
|
19
|
+
);
|
|
20
|
+
};
|