hyper-animator-codex 0.7.0 → 0.8.0
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 +67 -7
- package/bin/hyper-animator-codex.mjs +31 -9
- package/bin/postinstall.mjs +19 -0
- package/lib/install-options.mjs +3 -0
- package/lib/install-skill.mjs +84 -2
- package/lib/minimax-config.mjs +3 -3
- package/package.json +3 -2
- package/skills/hyper-animator-codex/SKILL.md +58 -20
- package/skills/hyper-animator-codex/agents/openai.yaml +2 -2
- package/skills/hyper-animator-codex/contracts/shot-plan.schema.json +214 -0
- package/skills/hyper-animator-codex/contracts/workflow-policy.json +85 -0
- package/skills/hyper-animator-codex/references/HyperFrames-AI-Generation-Patterns-codex.md +788 -0
- package/skills/hyper-animator-codex/references/beat-sync-workflow.md +7 -0
- package/skills/hyper-animator-codex/references/examples/shot-plan-dual-catalog.json +69 -0
- package/skills/hyper-animator-codex/references/hyperframes-agent-pseudocode.ts +1 -1
- package/skills/hyper-animator-codex/references/hyperframes-catalog-map.json +97 -230
- package/skills/hyper-animator-codex/references/hyperframes-intent-workflow.md +23 -7
- package/skills/hyper-animator-codex/references/minimax-music-workflow.md +24 -4
- package/skills/hyper-animator-codex/references/narration-audio-workflow.md +31 -1
- package/skills/hyper-animator-codex/references/shotcraft/LICENSE +202 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/ai-stream-response/README.md +46 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/autolayout-gap-dial/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/beat-cut-moves/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/beat-step-list-theme-cycle/README.md +59 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/before-after-slider-scrub/README.md +47 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/bottom-push-stack-wipe/README.md +58 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/brand-frame-snap/README.md +51 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/brand-ink-open/README.md +35 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/bubble-swarm-takeover/README.md +62 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/canvas-materialize-moves/README.md +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/card-flip-reveal/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/card-flock-tumble/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/cel-flash-stomp/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/chart-live-moves/README.md +51 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/circle-match-iris/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/cloner-depth-echo/README.md +38 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/collab-cursor-moves/README.md +48 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/color-block-step-wipe/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/command-palette-summon/README.md +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/crane-rise-reveal/README.md +47 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/crash-zoom-punch/README.md +38 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/dataviz-landscape-open/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/deck-deal-flyin/README.md +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/depth-layer-moves/README.md +40 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/document-typewriter-reveal/README.md +40 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/draw-svg-trace/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/edit-hook-moves/README.md +38 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/element-body-moves/README.md +49 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/fui-hud-moves/README.md +44 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/gauge-readout-moves/README.md +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/glow-flyline-moves/README.md +51 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/gradient-word-sweep/README.md +49 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/graze-face-tour/README.md +56 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/hashtag-to-pill-materialize/README.md +57 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/hires-rasterize-3d-text/README.md +34 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/icon-field-colorize/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/icon-performance-moves/README.md +46 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/impact-feedback/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/input-trigger-moves/README.md +49 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/integration-hub-map/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/letterspace-materialize/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/light-play-moves/README.md +49 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/line-boil/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/line-carry-transition/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/list-stack-press/README.md +43 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/magician-card-flourish/README.md +63 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/marker-underline-title/README.md +48 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/montage-rhythm-moves/README.md +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/morph-from-primitive/README.md +51 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/neon-frame-forerun/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/neon-frame-orbit-drop/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/neon-triple-marquee/README.md +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/odometer-digit-roll/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/outro-group-photo-launch/README.md +39 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/overhead-camera-moves/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/page-turn-transitions/README.md +48 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/page-waterfall-wall/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/panel-grid-moves/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/paper-craft-moves/README.md +46 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/paper-plane-messenger/README.md +62 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/paper-title-card/README.md +36 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/particle-celebrate-hits/README.md +42 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/particle-sand-fill/README.md +39 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/pill-slot-cycle/README.md +57 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/print-texture-transitions/README.md +40 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/rhythm-interrupt-moves/README.md +44 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/riso-print-hits/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/row-embed/README.md +36 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/runway-ground-skim/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/sakuga-timing-shift/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/scene-locked-title/README.md +43 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/scroll-brake-moves/README.md +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/segmented-thumb-hero/README.md +57 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/shot-transitions/README.md +60 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/skeleton-reveal/README.md +54 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/slam-entrance-moves/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/smear-multiples/README.md +49 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/space-camera-moves/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/spectrum-morph-ui/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/speed-ramp-freeze/README.md +42 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/split-flap-title/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/spotlight-hero-card/README.md +39 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/spotlight-sweep-moves/README.md +51 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/steep-tilt-glide/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/stroke-segment-build/README.md +43 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/tear-streak-transitions/README.md +43 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/tension-camera-moves/README.md +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/text-as-mask/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/text-column-converge/README.md +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/theme-switch-moves/README.md +44 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/timeline-travel/README.md +43 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/title-demote-to-label/README.md +58 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/trailer-grammar-moves/README.md +51 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/transition-hidden-cut/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/transition-travel/README.md +48 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/type-and-filter/README.md +37 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/type-assembly-moves/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/type-entrance-moves/README.md +46 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/type-rhythm-sync/README.md +47 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/typewriter-moves/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/ui-strip-away-outro/README.md +63 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/ui-to-brand-morph/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/voice-waveform-live/README.md +52 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/wall-reveal-moves/README.md +53 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/wipe-transitions/README.md +47 -0
- package/skills/hyper-animator-codex/references/shotcraft/cards/word-relay-filmstrip/README.md +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/catalog.json +3946 -0
- package/skills/hyper-animator-codex/references/shotcraft/references/aesthetic-rules.md +157 -0
- package/skills/hyper-animator-codex/references/shotcraft/references/final-review.md +107 -0
- package/skills/hyper-animator-codex/references/shotcraft/references/guided-free-creation.md +197 -0
- package/skills/hyper-animator-codex/references/shotcraft/references/music-beat-sync.md +125 -0
- package/skills/hyper-animator-codex/references/shotcraft/references/pipeline.md +357 -0
- package/skills/hyper-animator-codex/references/shotcraft/references/sound-design.md +126 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/Caption.tsx +50 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/DigitRoll.tsx +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/FlashCut.tsx +20 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/FlatPanel.tsx +65 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/PageCam.tsx +151 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/VerticalTicker.tsx +129 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/camera.tsx +75 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/motion.ts +40 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/rand.ts +11 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/shake.ts +10 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/_fixtures/Fixtures.tsx +83 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/ai-stream-response/StreamResponse.tsx +146 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/autolayout-gap-dial/AutolayoutGapDial.tsx +174 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/beat-cut-moves/BeatCutAccelerando.tsx +77 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/beat-cut-moves/PaparazziFlash.tsx +115 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +98 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +99 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/bottom-push-stack-wipe/BottomPushStackWipe.tsx +79 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/brand-frame-snap/BrandFrameSnap.tsx +110 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/bubble-swarm-takeover/BubbleSwarmTakeover.tsx +189 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/canvas-materialize-moves/DiagramCascadeBuild.tsx +172 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +254 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/card-flip-reveal/CardFlipReveal.tsx +139 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/card-flock-tumble/CardFlockTumble.tsx +382 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/cel-flash-stomp/CelFlashStomp.tsx +111 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/chart-live-moves/AxisRescaleShockV2.tsx +282 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/chart-live-moves/OscilloscopeStreamV2.tsx +227 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/chart-live-moves/UnitDotSwarmRegroupV2.tsx +248 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/circle-match-iris/CircleMatchIris.tsx +124 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/cloner-depth-echo/ClonerDepthEcho.tsx +90 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/collab-cursor-moves/CursorCastEnsemble.tsx +136 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/collab-cursor-moves/CursorDialogueDuet.tsx +145 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/color-block-step-wipe/ColorBlockStepWipe.tsx +157 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/command-palette-summon/CommandPaletteSummon.tsx +173 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/crane-rise-reveal/CraneRiseReveal.tsx +91 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/crash-zoom-punch/CrashImpactReal.tsx +63 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/crash-zoom-punch/CrashZoomReal.tsx +60 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/dataviz-landscape-open/DatavizLandscapeOpen.tsx +401 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/depth-layer-moves/DollyZoomReal.tsx +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/depth-layer-moves/MultiplaneReal.tsx +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/draw-svg-trace/DrawSvgTrace.tsx +199 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/edit-hook-moves/LogoStingButton.tsx +106 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/element-body-moves/AxialStretch.tsx +112 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/element-body-moves/ContactShadowLift.tsx +117 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/fui-hud-moves/LineUnfoldPanel.tsx +125 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/fui-hud-moves/ReticleLockOn.tsx +139 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/gauge-readout-moves/NeedleSweepSelftest.tsx +146 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/gauge-readout-moves/TapeScrollFixedPointer.tsx +120 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/glow-flyline-moves/FlylineArc.tsx +158 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/glow-flyline-moves/GlowOrbAmbient.tsx +131 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/glow-flyline-moves/OrbFlylineRelay.tsx +268 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/gradient-word-sweep/GradientWordSweep.tsx +307 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/graze-face-tour/GrazeFaceTour.tsx +469 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +166 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/icon-field-colorize/IconFieldColorize.tsx +93 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/icon-performance-moves/AttentionBounce.tsx +193 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/icon-performance-moves/PopBurstConfirm.tsx +162 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/impact-feedback/AnimeImpact.tsx +149 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/impact-feedback/HitCounter.tsx +147 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/input-trigger-moves/CursorPerformancePunchIn.tsx +154 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/input-trigger-moves/KeycapSmashCut.tsx +217 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/integration-hub-map/IntegrationHubMap.tsx +554 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/letterspace-materialize/LetterspaceMaterialize.tsx +85 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/light-play-moves/HalationBloom.tsx +139 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/light-play-moves/SheenSweepRetry.tsx +85 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/light-play-moves/SpotlightSweepReveal.tsx +102 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/line-boil/LineBoil.tsx +140 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/line-carry-transition/LineCarryTransition.tsx +151 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/magician-card-flourish/MagicianCardFlourish.tsx +294 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/marker-underline-title/MarkerUnderlineTitle.tsx +87 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/montage-rhythm-moves/DominoCascade.tsx +125 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/montage-rhythm-moves/DropBlackoutSlam.tsx +135 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/montage-rhythm-moves/WrightTripleCut.tsx +175 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/morph-from-primitive/MorphFromPrimitive.tsx +190 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/neon-frame-forerun/NeonFrameForerun.tsx +279 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +273 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/neon-triple-marquee/NeonTripleMarquee.tsx +111 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/odometer-digit-roll/OdometerDigitRoll.tsx +178 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/overhead-camera-moves/OverheadTabletopDrop.tsx +129 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/overhead-camera-moves/TiltReveal.tsx +55 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-turn-transitions/BarnDoorSplit.tsx +138 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-turn-transitions/CubeRotate.tsx +114 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-waterfall-wall/PageWaterfallWall.tsx +76 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-waterfall-wall/VerticalTicker.tsx +129 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/panel-grid-moves/ComicPanelSplit.tsx +171 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/panel-grid-moves/FlipGridReflow.tsx +121 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/panel-grid-moves/GridFlashMosaic.tsx +182 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/paper-craft-moves/MaskingTapeSlap.tsx +163 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/paper-craft-moves/PopupBookRise.tsx +134 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/paper-plane-messenger/PaperPlaneMessenger.tsx +183 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/particle-celebrate-hits/ConfettiCrossfire.tsx +115 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/particle-celebrate-hits/CounterTickSparks.tsx +103 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/particle-sand-fill/ParticleSandFill.tsx +119 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/pill-slot-cycle/PillSlotCycle.tsx +220 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/print-texture-transitions/InkBleedReveal.tsx +81 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/rhythm-interrupt-moves/JumpCutPunchIn.tsx +72 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/rhythm-interrupt-moves/StrobeBlackFrames.tsx +99 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/riso-print-hits/RisoBeatPump.tsx +155 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/riso-print-hits/RisoMisregistrationHit.tsx +120 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/runway-ground-skim/RunwayGroundSkim.tsx +258 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/sakuga-timing-shift/SakugaTimingShift.tsx +178 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/scene-locked-title/SceneLockedTitle.tsx +98 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/scroll-brake-moves/BrakeReticleLock.tsx +171 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/scroll-brake-moves/ChangelogScrollBrake.tsx +117 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/segmented-thumb-hero/SegmentedThumbHero.tsx +213 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/MaskWipeReal.tsx +67 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/PortalWipeV2.tsx +128 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/WhipBrakeReal.tsx +60 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/WhipPanReal.tsx +45 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/skeleton-reveal/SkeletonReveal.tsx +283 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/slam-entrance-moves/ImpactBurstKit.tsx +185 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/slam-entrance-moves/KanadaPerspectiveSnap.tsx +91 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/slam-entrance-moves/ScoreSlam.tsx +225 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/smear-multiples/SmearMultiples.tsx +88 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/space-camera-moves/DroneDiveLanding.tsx +91 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/space-camera-moves/ExplodedView.tsx +178 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/space-camera-moves/SnorricamLock.tsx +130 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/spectrum-morph-ui/SpectrumMorphUi.tsx +129 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/speed-ramp-freeze/FreezeAnnotateReal.tsx +70 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/speed-ramp-freeze/SpeedRampReal.tsx +58 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/split-flap-title/SplitFlapFlip.tsx +189 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/spotlight-sweep-moves/CornerSpotlightReveal.tsx +121 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +183 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/spotlight-sweep-moves/SlideSpotlightPan.tsx +171 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/steep-tilt-glide/SteepTiltGlide.tsx +315 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/stroke-segment-build/StrokeSegmentBuild.tsx +126 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/tear-streak-transitions/GlitchDisplace.tsx +107 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/BulletTimeFreezeOrbit.tsx +219 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/DutchRollToLevel.tsx +110 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/PullBackIsolation.tsx +120 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/SlowPushIn.tsx +96 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/text-as-mask/TextAsMask.tsx +94 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/text-column-converge/TextColumnConverge.tsx +122 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/theme-switch-moves/PaletteThemeRipple.tsx +207 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/theme-switch-moves/ThemeSweepToggle.tsx +123 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/timeline-travel/TimelineTravel.tsx +123 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/title-demote-to-label/TitleDemoteToLabel.tsx +174 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/trailer-grammar-moves/CardFootageCadence.tsx +118 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/trailer-grammar-moves/SmashCut.tsx +105 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/trailer-grammar-moves/TrailerBumper.tsx +103 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-hidden-cut/InvisibleCut.tsx +93 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-hidden-cut/LightLeakBurn.tsx +122 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-hidden-cut/VersusSlam.tsx +104 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-travel/LetterformZoom.tsx +141 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-travel/SharedElementMorph.tsx +101 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/LetterformDriftAssembly.tsx +107 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/SplitTextStagger.tsx +101 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/TextOnPath.tsx +92 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/TrackingExpandReveal.tsx +109 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-entrance-moves/LetterDropPhysics.tsx +100 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-entrance-moves/ScrambleDecode.tsx +90 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-rhythm-sync/FontWeightPump.tsx +124 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-rhythm-sync/KaraokeFillSync.tsx +93 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/typewriter-moves/TerminalTypewriter.tsx +122 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/typewriter-moves/TypewriterErrorRetype.tsx +109 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/ui-strip-away-outro/UiStripAwayOutro.tsx +218 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/ui-to-brand-morph/IconFlipBloomLogo.tsx +199 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/ui-to-brand-morph/InputMorphsIntoLogo.tsx +215 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/voice-waveform-live/VoiceWaveformLive.tsx +171 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/wall-reveal-moves/BentoLightUp.tsx +135 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/wipe-transitions/BlindsSlice.tsx +107 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/wipe-transitions/ClockWipe.tsx +83 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/demos/word-relay-filmstrip/WordRelayFilmstrip.tsx +300 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/Root.tsx +15 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/Caption.tsx +49 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/DigitRoll.tsx +44 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/FlashCut.tsx +19 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/Main.tsx +163 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/PaperTitleCard.tsx +89 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/PageCam.tsx +145 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneDetail.tsx +146 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneFlyIn.tsx +447 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneOpen.tsx +532 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneOutroLive.tsx +394 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/ScenePapers.tsx +185 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneWbr.tsx +299 -0
- package/skills/hyper-animator-codex/references/shotcraft/source/template/src/index.ts +4 -0
- package/skills/hyper-animator-codex/references/shotcraft/source-notes.md +10 -0
- package/skills/hyper-animator-codex/scripts/generate_minimax_music.mjs +27 -10
- package/skills/hyper-animator-codex/scripts/generate_minimax_tts.mjs +142 -13
- package/skills/hyper-animator-codex/scripts/generate_subtitles.mjs +42 -3
- package/skills/hyper-animator-codex/scripts/minimax_runtime_config.mjs +3 -3
- package/skills/hyper-animator-codex/scripts/query_shotcraft.mjs +140 -0
- package/skills/hyper-animator-codex/scripts/validate_hyperframes_html.py +22 -0
- package/skills/hyper-animator-codex/scripts/validate_provider_policy.mjs +108 -0
- package/skills/hyper-animator-codex/scripts/validate_shot_plan.mjs +193 -0
- package/skills/hyper-animator-codex/vendor/music-beat-detector/beat_detector/analyzer.py +3 -1
- package/skills/hyper-animator-codex/vendor/music-beat-detector/beat_detector/beat.py +37 -1
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
AbsoluteFill,
|
|
4
|
+
Easing,
|
|
5
|
+
Img,
|
|
6
|
+
interpolate,
|
|
7
|
+
useCurrentFrame,
|
|
8
|
+
} from 'remotion';
|
|
9
|
+
import backplate from './agent-stream.jpg';
|
|
10
|
+
|
|
11
|
+
const ROW_CUES = [42, 53, 63, 72, 80, 87, 93];
|
|
12
|
+
const ROWS = [
|
|
13
|
+
['Indexed the workspace', '128 files'],
|
|
14
|
+
['Mapped the authentication flow', '12 modules'],
|
|
15
|
+
['Checked recent error traces', 'No blockers'],
|
|
16
|
+
['Matched API contracts to handlers', '24 routes'],
|
|
17
|
+
['Verified permission boundaries', '6 roles'],
|
|
18
|
+
['Cross-checked release notes', '3 changes'],
|
|
19
|
+
['Prepared an implementation plan', 'Ready'],
|
|
20
|
+
] as const;
|
|
21
|
+
|
|
22
|
+
const clamp = {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'} as const;
|
|
23
|
+
const ease = Easing.bezier(0.2, 0.75, 0.25, 1);
|
|
24
|
+
|
|
25
|
+
const CheckIcon: React.FC<{progress: number}> = ({progress}) => {
|
|
26
|
+
const ringOpacity = interpolate(progress, [0, 0.45, 0.75], [0.36, 1, 0], clamp);
|
|
27
|
+
const checkOpacity = interpolate(progress, [0.62, 1], [0, 1], clamp);
|
|
28
|
+
const checkScale = interpolate(progress, [0.62, 1], [0.72, 1], {...clamp, easing: ease});
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<div style={{position: 'relative', width: 27, height: 27, flex: '0 0 auto'}}>
|
|
32
|
+
<div
|
|
33
|
+
style={{
|
|
34
|
+
position: 'absolute', inset: 2, borderRadius: 99,
|
|
35
|
+
border: '2px solid rgba(183, 190, 199, .6)',
|
|
36
|
+
borderTopColor: '#d4ff77', opacity: ringOpacity,
|
|
37
|
+
transform: `rotate(${progress * 100}deg)`,
|
|
38
|
+
}}
|
|
39
|
+
/>
|
|
40
|
+
<div
|
|
41
|
+
style={{
|
|
42
|
+
position: 'absolute', inset: 1, borderRadius: 99,
|
|
43
|
+
background: '#b8f36a', opacity: checkOpacity,
|
|
44
|
+
transform: `scale(${checkScale})`,
|
|
45
|
+
display: 'grid', placeItems: 'center',
|
|
46
|
+
boxShadow: '0 0 16px rgba(184,243,106,.18)',
|
|
47
|
+
}}
|
|
48
|
+
>
|
|
49
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none">
|
|
50
|
+
<path d="M3.4 8.3 6.6 11l6-6" stroke="#15200d" strokeWidth="2.1" strokeLinecap="round" strokeLinejoin="round"/>
|
|
51
|
+
</svg>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const EvidenceRow: React.FC<{cue: number; title: string; meta: string; index: number}> = ({cue, title, meta, index}) => {
|
|
58
|
+
const frame = useCurrentFrame();
|
|
59
|
+
const body = interpolate(frame, [cue, cue + 12], [0, 1], {...clamp, easing: ease});
|
|
60
|
+
const status = interpolate(frame, [cue + 3, cue + 11], [0, 1], {...clamp, easing: ease});
|
|
61
|
+
return (
|
|
62
|
+
<div
|
|
63
|
+
style={{
|
|
64
|
+
position: 'absolute', left: 0, right: 0, top: index * 68,
|
|
65
|
+
height: 58, borderRadius: 13,
|
|
66
|
+
border: '1px solid rgba(255,255,255,.065)',
|
|
67
|
+
background: 'rgba(255,255,255,.025)',
|
|
68
|
+
display: 'flex', alignItems: 'center', padding: '0 20px', gap: 15,
|
|
69
|
+
opacity: body,
|
|
70
|
+
transform: `translateY(${18 * (1 - body)}px)`,
|
|
71
|
+
filter: `blur(${6 * (1 - body)}px)`,
|
|
72
|
+
}}
|
|
73
|
+
>
|
|
74
|
+
<CheckIcon progress={status}/>
|
|
75
|
+
<div style={{fontSize: 21, color: '#e8eaed', letterSpacing: '-0.015em', flex: 1}}>{title}</div>
|
|
76
|
+
<div style={{fontSize: 16, color: status > 0.78 ? '#a9c77f' : '#777f89', fontVariantNumeric: 'tabular-nums'}}>{meta}</div>
|
|
77
|
+
</div>
|
|
78
|
+
);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export const StreamResponse: React.FC = () => {
|
|
82
|
+
const frame = useCurrentFrame();
|
|
83
|
+
const panelIn = interpolate(frame, [0, 16], [0, 1], {...clamp, easing: ease});
|
|
84
|
+
const summary = interpolate(frame, [18, 30], [0, 1], {...clamp, easing: ease});
|
|
85
|
+
const camera = interpolate(frame, [0, 100], [1.04, 1], {...clamp, easing: ease});
|
|
86
|
+
const pulse = interpolate(frame, [110, 115, 120], [0.25, 0.55, 0.25], clamp);
|
|
87
|
+
const complete = interpolate(frame, [110, 120], [0, 1], {...clamp, easing: ease});
|
|
88
|
+
|
|
89
|
+
return (
|
|
90
|
+
<AbsoluteFill style={{background: '#07090a', fontFamily: 'Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif', overflow: 'hidden'}}>
|
|
91
|
+
<AbsoluteFill style={{transform: `scale(${camera})`}}>
|
|
92
|
+
<Img src={backplate} style={{width: '100%', height: '100%', objectFit: 'cover', filter: 'brightness(.58) saturate(.76) blur(1px)', opacity: .7}}/>
|
|
93
|
+
<AbsoluteFill style={{background: 'radial-gradient(circle at 50% 44%, rgba(6,9,10,.08) 10%, rgba(4,6,7,.72) 92%)'}}/>
|
|
94
|
+
</AbsoluteFill>
|
|
95
|
+
|
|
96
|
+
<div
|
|
97
|
+
style={{
|
|
98
|
+
position: 'absolute', left: 344, top: 72, width: 1232, height: 936,
|
|
99
|
+
borderRadius: 29, overflow: 'hidden',
|
|
100
|
+
background: 'linear-gradient(145deg, rgba(25,29,32,.985), rgba(12,15,17,.99))',
|
|
101
|
+
border: `1px solid rgba(184,243,106,${pulse})`,
|
|
102
|
+
boxShadow: '0 46px 100px rgba(0,0,0,.58), inset 0 1px 0 rgba(255,255,255,.06)',
|
|
103
|
+
opacity: panelIn,
|
|
104
|
+
transform: `translateY(${12 * (1 - panelIn)}px) scale(${.985 + .015 * panelIn})`,
|
|
105
|
+
}}
|
|
106
|
+
>
|
|
107
|
+
<div style={{height: 76, display: 'flex', alignItems: 'center', padding: '0 34px', borderBottom: '1px solid rgba(255,255,255,.065)'}}>
|
|
108
|
+
<div style={{width: 29, height: 29, borderRadius: 9, background: '#e9edf0', color: '#15191b', display: 'grid', placeItems: 'center', fontWeight: 800, fontSize: 17}}>A</div>
|
|
109
|
+
<div style={{marginLeft: 13, fontSize: 22, fontWeight: 590, color: '#f1f3f4'}}>Ask Atlas</div>
|
|
110
|
+
<div style={{marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 9, color: '#7d858e', fontSize: 15}}>
|
|
111
|
+
<span style={{width: 7, height: 7, background: '#b8f36a', borderRadius: 99}}/> Workspace agent
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
<div style={{padding: '28px 38px 34px'}}>
|
|
116
|
+
<div style={{height: 48, borderRadius: 12, background: 'rgba(255,255,255,.048)', display: 'flex', alignItems: 'center', padding: '0 18px', color: '#b9bec4', fontSize: 18}}>
|
|
117
|
+
Review this codebase and identify the safest implementation path
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<div style={{height: 119, marginTop: 21, borderBottom: '1px solid rgba(255,255,255,.07)', overflow: 'hidden', position: 'relative'}}>
|
|
121
|
+
<div style={{position: 'absolute', inset: 0, opacity: summary, transform: `translateY(${10 * (1 - summary)}px)`, clipPath: `inset(0 ${100 * (1 - summary)}% 0 0)`}}>
|
|
122
|
+
<div style={{color: '#838b94', fontSize: 15, textTransform: 'uppercase', letterSpacing: '.12em', marginBottom: 10}}>Result summary</div>
|
|
123
|
+
<div style={{color: '#f3f4f5', fontSize: 26, fontWeight: 510, lineHeight: 1.35, letterSpacing: '-.022em'}}>
|
|
124
|
+
The codebase is ready for a focused, low-risk implementation.
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<div style={{position: 'relative', height: 466, marginTop: 17}}>
|
|
130
|
+
{ROWS.map(([title, meta], index) => <EvidenceRow key={title} cue={ROW_CUES[index]} title={title} meta={meta} index={index}/>)}
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<div style={{height: 60, marginTop: 2, borderTop: '1px solid rgba(255,255,255,.07)', display: 'flex', alignItems: 'flex-end'}}>
|
|
134
|
+
<div style={{display: 'flex', alignItems: 'center', gap: 11, opacity: complete, transform: `translateY(${5 * (1 - complete)}px)`}}>
|
|
135
|
+
<div style={{width: 24, height: 24, borderRadius: 99, background: '#b8f36a', display: 'grid', placeItems: 'center'}}>
|
|
136
|
+
<svg width="14" height="14" viewBox="0 0 16 16" fill="none"><path d="M3.4 8.3 6.6 11l6-6" stroke="#15200d" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round"/></svg>
|
|
137
|
+
</div>
|
|
138
|
+
<span style={{color: '#dce7d0', fontSize: 17, fontWeight: 560}}>Analysis complete</span>
|
|
139
|
+
<span style={{color: '#69717a', fontSize: 15}}>7 checks finished · ready to build</span>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
</AbsoluteFill>
|
|
145
|
+
);
|
|
146
|
+
};
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// autolayout-gap-dial —— framer-ai 4.5–5.5s
|
|
2
|
+
// 一排导航链接块带框选描边 + 间距标注徽章,徽章数字逐格跳动,
|
|
3
|
+
// 链接块被参数实时推开(flex gap 插值),标注线跟随。
|
|
4
|
+
// demo 放大做:间距从紧(16)拉到松(64),再弹簧回弹归位。
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { AbsoluteFill, useCurrentFrame, interpolate, spring, useVideoConfig, Easing } from 'remotion';
|
|
7
|
+
import { G } from '../_fixtures/Fixtures';
|
|
8
|
+
|
|
9
|
+
const BLOCK_WIDTHS = [230, 190, 265, 210, 245];
|
|
10
|
+
const BLOCK_H = 100;
|
|
11
|
+
const ROW_Y = 540; // 行中心
|
|
12
|
+
const G_MIN = 12;
|
|
13
|
+
const G_MAX = 110;
|
|
14
|
+
|
|
15
|
+
const GROW_START = 14;
|
|
16
|
+
const GROW_END = 52;
|
|
17
|
+
const HOLD_END = 66;
|
|
18
|
+
|
|
19
|
+
export const AutolayoutGapDial: React.FC = () => {
|
|
20
|
+
const frame = useCurrentFrame();
|
|
21
|
+
const { fps } = useVideoConfig();
|
|
22
|
+
|
|
23
|
+
// 间距参数曲线:紧 → 松(easeInOut)→ hold → 弹簧回弹归位(带过冲)
|
|
24
|
+
let gap: number;
|
|
25
|
+
if (frame < HOLD_END) {
|
|
26
|
+
gap = interpolate(frame, [GROW_START, GROW_END], [G_MIN, G_MAX], {
|
|
27
|
+
extrapolateLeft: 'clamp',
|
|
28
|
+
extrapolateRight: 'clamp',
|
|
29
|
+
easing: Easing.inOut(Easing.cubic),
|
|
30
|
+
});
|
|
31
|
+
} else {
|
|
32
|
+
const s = spring({ frame: frame - HOLD_END, fps, config: { damping: 9, stiffness: 80, mass: 1.1 } });
|
|
33
|
+
gap = G_MAX + (G_MIN - G_MAX) * s; // damping 9 → 过冲到 G_MIN 以下再回稳
|
|
34
|
+
}
|
|
35
|
+
const gapShown = Math.round(gap / 2) * 2; // 徽章逐格跳数(步进 2)
|
|
36
|
+
|
|
37
|
+
// 布局:居中排布
|
|
38
|
+
const total = BLOCK_WIDTHS.reduce((a, b) => a + b, 0) + gap * (BLOCK_WIDTHS.length - 1);
|
|
39
|
+
const startX = (1920 - total) / 2;
|
|
40
|
+
const xs: number[] = [];
|
|
41
|
+
let acc = startX;
|
|
42
|
+
for (const w of BLOCK_WIDTHS) {
|
|
43
|
+
xs.push(acc);
|
|
44
|
+
acc += w + gap;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 框选描边入场
|
|
48
|
+
const selIn = spring({ frame: frame - 2, fps, config: { damping: 14, stiffness: 130 } });
|
|
49
|
+
const pad = 26;
|
|
50
|
+
const selX = startX - pad;
|
|
51
|
+
const selW = total + pad * 2;
|
|
52
|
+
const selY = ROW_Y - BLOCK_H / 2 - pad;
|
|
53
|
+
const selH = BLOCK_H + pad * 2;
|
|
54
|
+
|
|
55
|
+
// 徽章在数值变动时的每格"跳一下"
|
|
56
|
+
const ticking = Math.abs(gap - (frame < HOLD_END ? G_MIN : G_MIN)) > 0.5 && (frame >= GROW_START && frame < HOLD_END + 40);
|
|
57
|
+
const tickPulse = ticking ? 1 + 0.10 * Math.abs(Math.sin(frame * 0.9)) : 1;
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<AbsoluteFill style={{ background: G.bg, overflow: 'hidden' }}>
|
|
61
|
+
<AbsoluteFill
|
|
62
|
+
style={{
|
|
63
|
+
backgroundImage: `radial-gradient(${G.line} 3px, transparent 3px)`,
|
|
64
|
+
backgroundSize: '52px 52px',
|
|
65
|
+
}}
|
|
66
|
+
/>
|
|
67
|
+
|
|
68
|
+
{/* 标题字块(讲清这是"参数驱动布局") */}
|
|
69
|
+
<div style={{ position: 'absolute', top: 250, width: '100%', textAlign: 'center', fontFamily: 'Helvetica, Arial, sans-serif', fontWeight: 800, fontSize: 44, color: G.mid, letterSpacing: 2 }}>
|
|
70
|
+
GAP
|
|
71
|
+
<span style={{ display: 'inline-block', minWidth: 130, marginLeft: 24, padding: '4px 22px', borderRadius: 12, background: G.ink, color: '#f2f2f0', fontVariantNumeric: 'tabular-nums', transform: `scale(${tickPulse})` }}>
|
|
72
|
+
{gapShown}
|
|
73
|
+
</span>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
{/* 框选描边 + 8 手柄 */}
|
|
77
|
+
<div
|
|
78
|
+
style={{
|
|
79
|
+
position: 'absolute',
|
|
80
|
+
left: selX,
|
|
81
|
+
top: selY,
|
|
82
|
+
width: selW,
|
|
83
|
+
height: selH,
|
|
84
|
+
border: `3px solid ${G.ink}`,
|
|
85
|
+
borderRadius: 6,
|
|
86
|
+
opacity: selIn,
|
|
87
|
+
boxSizing: 'border-box',
|
|
88
|
+
}}
|
|
89
|
+
>
|
|
90
|
+
{[
|
|
91
|
+
[0, 0], [0.5, 0], [1, 0],
|
|
92
|
+
[0, 0.5], [1, 0.5],
|
|
93
|
+
[0, 1], [0.5, 1], [1, 1],
|
|
94
|
+
].map(([hx, hy], i) => (
|
|
95
|
+
<div
|
|
96
|
+
key={i}
|
|
97
|
+
style={{
|
|
98
|
+
position: 'absolute',
|
|
99
|
+
left: `${hx * 100}%`,
|
|
100
|
+
top: `${hy * 100}%`,
|
|
101
|
+
width: 16,
|
|
102
|
+
height: 16,
|
|
103
|
+
marginLeft: -8,
|
|
104
|
+
marginTop: -8,
|
|
105
|
+
background: '#fff',
|
|
106
|
+
border: `3px solid ${G.ink}`,
|
|
107
|
+
borderRadius: 3,
|
|
108
|
+
boxSizing: 'border-box',
|
|
109
|
+
}}
|
|
110
|
+
/>
|
|
111
|
+
))}
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
{/* 链接块 */}
|
|
115
|
+
{BLOCK_WIDTHS.map((w, i) => (
|
|
116
|
+
<div
|
|
117
|
+
key={i}
|
|
118
|
+
style={{
|
|
119
|
+
position: 'absolute',
|
|
120
|
+
left: xs[i],
|
|
121
|
+
top: ROW_Y - BLOCK_H / 2,
|
|
122
|
+
width: w,
|
|
123
|
+
height: BLOCK_H,
|
|
124
|
+
background: G.card,
|
|
125
|
+
border: `2px solid ${G.border}`,
|
|
126
|
+
borderRadius: 14,
|
|
127
|
+
boxShadow: '0 3px 12px rgba(0,0,0,0.07)',
|
|
128
|
+
display: 'flex',
|
|
129
|
+
alignItems: 'center',
|
|
130
|
+
justifyContent: 'center',
|
|
131
|
+
boxSizing: 'border-box',
|
|
132
|
+
}}
|
|
133
|
+
>
|
|
134
|
+
<div style={{ height: 16, width: w - 76, background: G.bar, borderRadius: 8 }} />
|
|
135
|
+
</div>
|
|
136
|
+
))}
|
|
137
|
+
|
|
138
|
+
{/* 间距标注:测量线 + 端刺 + 跟随徽章 */}
|
|
139
|
+
{xs.slice(0, -1).map((x, i) => {
|
|
140
|
+
const gx = x + BLOCK_WIDTHS[i]; // 缝隙左缘
|
|
141
|
+
const cy = ROW_Y + BLOCK_H / 2 + 56;
|
|
142
|
+
const badgeOp = interpolate(frame, [8, 16], [0, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
|
|
143
|
+
return (
|
|
144
|
+
<div key={i} style={{ position: 'absolute', left: 0, top: 0, opacity: badgeOp }}>
|
|
145
|
+
{/* 竖直延长线 */}
|
|
146
|
+
<div style={{ position: 'absolute', left: gx - 1.5, top: ROW_Y + BLOCK_H / 2 + 6, width: 3, height: 62, background: G.mid, opacity: 0.55 }} />
|
|
147
|
+
<div style={{ position: 'absolute', left: gx + gap - 1.5, top: ROW_Y + BLOCK_H / 2 + 6, width: 3, height: 62, background: G.mid, opacity: 0.55 }} />
|
|
148
|
+
{/* 水平测量线 */}
|
|
149
|
+
<div style={{ position: 'absolute', left: gx, top: cy - 1.5, width: gap, height: 3, background: G.ink }} />
|
|
150
|
+
{/* 徽章(跟随缝隙中心) */}
|
|
151
|
+
<div
|
|
152
|
+
style={{
|
|
153
|
+
position: 'absolute',
|
|
154
|
+
left: gx + gap / 2,
|
|
155
|
+
top: cy + 18,
|
|
156
|
+
transform: `translateX(-50%) scale(${tickPulse})`,
|
|
157
|
+
padding: '5px 14px',
|
|
158
|
+
borderRadius: 10,
|
|
159
|
+
background: G.ink,
|
|
160
|
+
color: '#f2f2f0',
|
|
161
|
+
fontFamily: 'Helvetica, Arial, sans-serif',
|
|
162
|
+
fontWeight: 700,
|
|
163
|
+
fontSize: 24,
|
|
164
|
+
fontVariantNumeric: 'tabular-nums',
|
|
165
|
+
}}
|
|
166
|
+
>
|
|
167
|
+
{gapShown}
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
);
|
|
171
|
+
})}
|
|
172
|
+
</AbsoluteFill>
|
|
173
|
+
);
|
|
174
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AbsoluteFill, Easing, interpolate, useCurrentFrame } from 'remotion';
|
|
3
|
+
import { FakeDashboard, G } from '../_fixtures/Fixtures';
|
|
4
|
+
|
|
5
|
+
// beat-cut-accelerando:六个不同构图按 16→12→8→6→4 帧递减间隔全屏硬切,
|
|
6
|
+
// 加速逼近,最后一切戛然定格回主画面并 1→1.06 慢推收住。
|
|
7
|
+
// 真硬切:frame 落在哪个区间就渲染哪个视图,无任何过渡。
|
|
8
|
+
|
|
9
|
+
// 一个视图 = FakeDashboard 变体 + 缩放 + 对焦点(画面上要被推到屏幕中心的点)
|
|
10
|
+
type View = { variant: 'A' | 'B'; scale: number; cx: number; cy: number };
|
|
11
|
+
|
|
12
|
+
const VIEWS: View[] = [
|
|
13
|
+
{ variant: 'A', scale: 1, cx: 960, cy: 540 }, // v0 全景(建立)
|
|
14
|
+
{ variant: 'A', scale: 1.8, cx: 1070, cy: 576 }, // v1 卡片区
|
|
15
|
+
{ variant: 'A', scale: 2.6, cx: 600, cy: 340 }, // v2 单卡特写
|
|
16
|
+
{ variant: 'B', scale: 1, cx: 960, cy: 540 }, // v3 列表页全景
|
|
17
|
+
{ variant: 'B', scale: 1.9, cx: 1070, cy: 500 }, // v4 列表行区
|
|
18
|
+
{ variant: 'B', scale: 2.8, cx: 1070, cy: 290 }, // v5 单行特写
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
// 每段起始帧:建立 49f,然后间隔 16→12→8→6→4,末段(回主画面)hold 35f
|
|
22
|
+
// 0–48 v0 | 49–64 v1 | 65–76 v2 | 77–84 v3 | 85–90 v4 | 91–94 v5 | 95–129 定格
|
|
23
|
+
const CUTS = [0, 49, 65, 77, 85, 91, 95];
|
|
24
|
+
const FINAL = 95; // 最后一切:戛然定格回主画面
|
|
25
|
+
|
|
26
|
+
const ViewShot: React.FC<{ view: View; extraScale?: number }> = ({ view, extraScale = 1 }) => {
|
|
27
|
+
const s = view.scale * extraScale;
|
|
28
|
+
return (
|
|
29
|
+
<div
|
|
30
|
+
style={{
|
|
31
|
+
width: 1920,
|
|
32
|
+
height: 1080,
|
|
33
|
+
transformOrigin: `${view.cx}px ${view.cy}px`,
|
|
34
|
+
transform: `translate(${960 - view.cx}px, ${540 - view.cy}px) scale(${s})`,
|
|
35
|
+
}}
|
|
36
|
+
>
|
|
37
|
+
<FakeDashboard variant={view.variant} />
|
|
38
|
+
</div>
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const BeatCutAccelerando: React.FC = () => {
|
|
43
|
+
const frame = useCurrentFrame();
|
|
44
|
+
|
|
45
|
+
// 当前落在哪个区间(末段 = 主画面 v0)
|
|
46
|
+
let seg = 0;
|
|
47
|
+
for (let i = 0; i < CUTS.length; i++) {
|
|
48
|
+
if (frame >= CUTS[i]) seg = i;
|
|
49
|
+
}
|
|
50
|
+
const isFinal = seg === CUTS.length - 1;
|
|
51
|
+
const view = isFinal ? VIEWS[0] : VIEWS[seg];
|
|
52
|
+
|
|
53
|
+
// 末段慢推:scale 1 → 1.06,ease-out,推 22f 后静止(结尾静止 ≥15f)
|
|
54
|
+
const push = isFinal
|
|
55
|
+
? interpolate(frame, [FINAL, FINAL + 20], [1, 1.06], {
|
|
56
|
+
extrapolateLeft: 'clamp',
|
|
57
|
+
extrapolateRight: 'clamp',
|
|
58
|
+
easing: Easing.out(Easing.cubic),
|
|
59
|
+
})
|
|
60
|
+
: 1;
|
|
61
|
+
|
|
62
|
+
// 每次硬切的 1f 亮度跳变(约 +5%)模拟快门
|
|
63
|
+
const isCutFrame = CUTS.some((c, i) => i > 0 && frame === c);
|
|
64
|
+
const flash = isCutFrame ? 1.05 : 1;
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<AbsoluteFill style={{ background: G.bg, overflow: 'hidden' }}>
|
|
68
|
+
<div style={{ position: 'absolute', inset: 0, filter: `brightness(${flash})` }}>
|
|
69
|
+
<ViewShot view={view} extraScale={push} />
|
|
70
|
+
</div>
|
|
71
|
+
{/* 切帧再叠一层极薄白闪,保证肉眼可感 */}
|
|
72
|
+
{isCutFrame && (
|
|
73
|
+
<AbsoluteFill style={{ background: '#ffffff', opacity: 0.06 }} />
|
|
74
|
+
)}
|
|
75
|
+
</AbsoluteFill>
|
|
76
|
+
);
|
|
77
|
+
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AbsoluteFill, Easing, interpolate, useCurrentFrame } from 'remotion';
|
|
3
|
+
import { FakeDashboard, TitleBlock, G } from '../_fixtures/Fixtures';
|
|
4
|
+
|
|
5
|
+
// paparazzi flash 连闪定格:高光时刻三连白闪,每闪硬切同一素材的不同裁切
|
|
6
|
+
// (全景→卡片特写→数字特写),每闪切入画面带 1.03→1 回落 + 半格沉降像快门
|
|
7
|
+
// 余韵,白闪帧加微位移抖动模拟快门震,第三闪后停在数字特写收束。
|
|
8
|
+
const F1 = 30; // 第一闪(间隔 22f)
|
|
9
|
+
const F2 = 52; // 第二闪(间隔 18f)
|
|
10
|
+
const F3 = 70; // 第三闪,之后 hold 60f
|
|
11
|
+
const SETTLE = 6; // 切入回落时长
|
|
12
|
+
const DECAY = 4; // 白层衰减时长
|
|
13
|
+
const FLASHES = [F1, F2, F3];
|
|
14
|
+
|
|
15
|
+
// seed 正弦哈希,返回 -1..1(禁 Math.random)
|
|
16
|
+
const hash = (i: number) => {
|
|
17
|
+
const s = Math.sin(i * 127.3) * 43758.5453;
|
|
18
|
+
return (s - Math.floor(s)) * 2 - 1;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// 同一"素材":全景 dashboard,顶行中间卡片上叠一个大数字,供数字特写裁切
|
|
22
|
+
const Footage: React.FC = () => (
|
|
23
|
+
<div style={{ position: 'absolute', width: 1920, height: 1080 }}>
|
|
24
|
+
<FakeDashboard variant="A" />
|
|
25
|
+
<div style={{ position: 'absolute', left: 1070, top: 350, transform: 'translate(-50%, -50%)' }}>
|
|
26
|
+
<TitleBlock text="84,213" size={104} />
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
// 四个视图:闪前"活素材"慢推 + 三个定格裁切(全景 / 卡片 / 数字)
|
|
32
|
+
type View = { scale: number; origin: string };
|
|
33
|
+
const VIEW_WIDE: View = { scale: 1.0, origin: '960px 540px' };
|
|
34
|
+
const VIEW_CARD: View = { scale: 2.3, origin: '1070px 335px' };
|
|
35
|
+
const VIEW_DIGIT: View = { scale: 4.0, origin: '1070px 350px' };
|
|
36
|
+
|
|
37
|
+
export const PaparazziFlash: React.FC = () => {
|
|
38
|
+
const frame = useCurrentFrame();
|
|
39
|
+
|
|
40
|
+
// 当前处于哪一段:-1 = 闪前活素材段
|
|
41
|
+
let seg = -1;
|
|
42
|
+
for (let i = 0; i < FLASHES.length; i++) {
|
|
43
|
+
if (frame >= FLASHES[i]) seg = i;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let scale: number;
|
|
47
|
+
let origin: string;
|
|
48
|
+
let settleScale = 1;
|
|
49
|
+
let settleY = 0;
|
|
50
|
+
|
|
51
|
+
if (seg === -1) {
|
|
52
|
+
// 闪前:中景慢推(活的),衬托闪后定格的"死"
|
|
53
|
+
origin = '900px 480px';
|
|
54
|
+
scale = interpolate(frame, [0, F1], [1.16, 1.2], {
|
|
55
|
+
extrapolateRight: 'clamp',
|
|
56
|
+
easing: Easing.inOut(Easing.quad),
|
|
57
|
+
});
|
|
58
|
+
} else {
|
|
59
|
+
const view = [VIEW_WIDE, VIEW_CARD, VIEW_DIGIT][seg];
|
|
60
|
+
scale = view.scale;
|
|
61
|
+
origin = view.origin;
|
|
62
|
+
// 切入回落:1.03→1 的 6f 收敛 + 半格沉降(-16px 落回 0)像快门余韵
|
|
63
|
+
const t = interpolate(frame, [FLASHES[seg], FLASHES[seg] + SETTLE], [1, 0], {
|
|
64
|
+
extrapolateLeft: 'clamp',
|
|
65
|
+
extrapolateRight: 'clamp',
|
|
66
|
+
easing: Easing.out(Easing.cubic),
|
|
67
|
+
});
|
|
68
|
+
settleScale = 1 + 0.03 * t;
|
|
69
|
+
settleY = -16 * t;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 白闪层:每个切点 0.95→0,4f 衰减,取各闪最大值
|
|
73
|
+
let flash = 0;
|
|
74
|
+
for (const f of FLASHES) {
|
|
75
|
+
const o = interpolate(frame, [f, f + DECAY], [0.95, 0], {
|
|
76
|
+
extrapolateLeft: 'clamp',
|
|
77
|
+
extrapolateRight: 'clamp',
|
|
78
|
+
easing: Easing.out(Easing.quad),
|
|
79
|
+
});
|
|
80
|
+
if (frame >= f && frame < f + DECAY + 1) flash = Math.max(flash, o);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// 白闪帧全屏微位移抖动模拟快门震(seed 哈希,非随机)
|
|
84
|
+
const inFlash = FLASHES.some((f) => frame >= f && frame < f + DECAY);
|
|
85
|
+
const jx = inFlash ? 2 * hash(frame * 7 + 1) : 0;
|
|
86
|
+
const jy = inFlash ? 2 * hash(frame * 13 + 5) : 0;
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<AbsoluteFill style={{ background: G.ink, overflow: 'hidden' }}>
|
|
90
|
+
<div
|
|
91
|
+
style={{
|
|
92
|
+
position: 'absolute',
|
|
93
|
+
inset: 0,
|
|
94
|
+
transform: `translate(${jx}px, ${jy + settleY}px)`,
|
|
95
|
+
}}
|
|
96
|
+
>
|
|
97
|
+
<div
|
|
98
|
+
style={{
|
|
99
|
+
position: 'absolute',
|
|
100
|
+
width: 1920,
|
|
101
|
+
height: 1080,
|
|
102
|
+
transform: `scale(${scale * settleScale})`,
|
|
103
|
+
transformOrigin: origin,
|
|
104
|
+
}}
|
|
105
|
+
>
|
|
106
|
+
<Footage />
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
{/* 白闪层 */}
|
|
110
|
+
{flash > 0 && (
|
|
111
|
+
<AbsoluteFill style={{ background: '#ffffff', opacity: flash }} />
|
|
112
|
+
)}
|
|
113
|
+
</AbsoluteFill>
|
|
114
|
+
);
|
|
115
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// beat-step-list-theme-cycle(bear 22.3–24.6s)
|
|
2
|
+
// 深色场形容词列表逐拍步进:每拍列表上移一行 + 选中胶囊跳到下一行并换色
|
|
3
|
+
// (绿→紫→红),整场底色同步换(深棕→深紫→深藏青)。
|
|
4
|
+
// 一拍之内"行、色、场"三通道同步跳变,~0.6s 一拍。
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { AbsoluteFill, interpolate, useCurrentFrame } from 'remotion';
|
|
7
|
+
|
|
8
|
+
const FONT = 'Helvetica, Arial, sans-serif';
|
|
9
|
+
const ROW_H = 150;
|
|
10
|
+
const WORDS = ['modern', 'playful', 'expressive', 'seamless', 'intuitive'];
|
|
11
|
+
|
|
12
|
+
// 拍点:~0.6s 一拍 = 18 帧
|
|
13
|
+
const BEAT_LEN = 18;
|
|
14
|
+
const FIRST_BEAT = 30; // 前 1s 静置铺垫
|
|
15
|
+
const N_BEATS = 3;
|
|
16
|
+
|
|
17
|
+
// 每拍的(胶囊色 / 场底色)——起始态 + 三拍
|
|
18
|
+
const THEMES = [
|
|
19
|
+
{ pill: '#d8d8d4', bg: '#241a12', ink: '#2a2018' }, // modern:灰白胶囊 / 深棕场
|
|
20
|
+
{ pill: '#4fae62', bg: '#1e2416', ink: '#173015' }, // playful:绿
|
|
21
|
+
{ pill: '#8e6fd8', bg: '#221a33', ink: '#2a2144' }, // expressive:紫
|
|
22
|
+
{ pill: '#d64d55', bg: '#141c2e', ink: '#1a2440' }, // seamless:红 / 深藏青
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
// 拍内跳变:5 帧内完成,ease-out + 微过冲
|
|
26
|
+
const snap = (t: number) => interpolate(t, [0, 1], [0, 1], {
|
|
27
|
+
easing: (x) => 1 - Math.pow(1 - x, 3.2),
|
|
28
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export const BeatStepListThemeCycle: React.FC = () => {
|
|
32
|
+
const frame = useCurrentFrame();
|
|
33
|
+
|
|
34
|
+
// 当前拍序号与拍内进度(跳变只占拍头 6 帧)
|
|
35
|
+
const raw = (frame - FIRST_BEAT) / BEAT_LEN;
|
|
36
|
+
const beat = Math.min(N_BEATS, Math.max(0, Math.floor(raw) + 1)); // 已触发的拍数
|
|
37
|
+
const beatStartFrame = FIRST_BEAT + (beat - 1) * BEAT_LEN;
|
|
38
|
+
const tInBeat = beat === 0 ? 1 : snap((frame - beatStartFrame) / 6);
|
|
39
|
+
|
|
40
|
+
// 连续步进量:整数拍 + 拍头 6 帧内的插值
|
|
41
|
+
const step = beat === 0 ? 0 : (beat - 1) + tInBeat;
|
|
42
|
+
|
|
43
|
+
// 三通道 —— 1) 列表上移一行
|
|
44
|
+
const listY = -step * ROW_H;
|
|
45
|
+
|
|
46
|
+
// 2) 胶囊换色(拍头硬跳,带一点 cross-fade)
|
|
47
|
+
const themePrev = THEMES[Math.max(0, beat - 1)];
|
|
48
|
+
const themeNow = THEMES[beat];
|
|
49
|
+
const mixT = beat === 0 ? 1 : tInBeat;
|
|
50
|
+
const mix = (a: string, b: string, t: number) => {
|
|
51
|
+
const pa = [1, 3, 5].map((i) => parseInt(a.slice(i, i + 2), 16));
|
|
52
|
+
const pb = [1, 3, 5].map((i) => parseInt(b.slice(i, i + 2), 16));
|
|
53
|
+
return `rgb(${pa.map((v, i) => Math.round(v + (pb[i] - v) * t)).join(',')})`;
|
|
54
|
+
};
|
|
55
|
+
const pillColor = mix(themePrev.pill, themeNow.pill, mixT);
|
|
56
|
+
const bgColor = mix(themePrev.bg, themeNow.bg, mixT);
|
|
57
|
+
|
|
58
|
+
// 胶囊每拍落位时 squash 弹一下
|
|
59
|
+
const pop = beat === 0 ? 1 : interpolate(tInBeat, [0, 0.6, 1], [1.12, 0.97, 1]);
|
|
60
|
+
|
|
61
|
+
// 选中行文字反白判定:胶囊固定在视口中央行,选中词 = WORDS[beat]
|
|
62
|
+
const selectedIdx = beat;
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<AbsoluteFill style={{ background: bgColor, fontFamily: FONT, justifyContent: 'center' }}>
|
|
66
|
+
{/* 中央固定胶囊(列表在其下滚动,视觉上"胶囊跳到下一行") */}
|
|
67
|
+
<div style={{
|
|
68
|
+
position: 'absolute', left: '50%', top: 540 - ROW_H / 2 + 10,
|
|
69
|
+
width: 900, height: ROW_H - 20, transform: `translateX(-50%) scale(${pop})`,
|
|
70
|
+
background: pillColor, borderRadius: 999,
|
|
71
|
+
boxShadow: '0 14px 40px rgba(0,0,0,0.35)',
|
|
72
|
+
}} />
|
|
73
|
+
{/* 词列表 */}
|
|
74
|
+
<div style={{
|
|
75
|
+
position: 'absolute', left: 0, right: 0, top: 540 - ROW_H / 2,
|
|
76
|
+
transform: `translateY(${listY}px)`,
|
|
77
|
+
}}>
|
|
78
|
+
{WORDS.map((w, i) => {
|
|
79
|
+
const isSel = i === selectedIdx;
|
|
80
|
+
return (
|
|
81
|
+
<div key={w} style={{
|
|
82
|
+
height: ROW_H, display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
83
|
+
}}>
|
|
84
|
+
<span style={{
|
|
85
|
+
fontSize: 92, fontWeight: 800, letterSpacing: -1.5,
|
|
86
|
+
color: isSel ? (beat === 0 ? '#2a2018' : '#ffffff') : 'rgba(255,255,255,0.34)',
|
|
87
|
+
position: 'relative', zIndex: 2,
|
|
88
|
+
}}>{w}</span>
|
|
89
|
+
</div>
|
|
90
|
+
);
|
|
91
|
+
})}
|
|
92
|
+
</div>
|
|
93
|
+
{/* 视口上下羽化 */}
|
|
94
|
+
<div style={{ position: 'absolute', left: 0, right: 0, top: 0, height: 300, background: `linear-gradient(${bgColor}, transparent)`, zIndex: 3 }} />
|
|
95
|
+
<div style={{ position: 'absolute', left: 0, right: 0, bottom: 0, height: 300, background: `linear-gradient(transparent, ${bgColor})`, zIndex: 3 }} />
|
|
96
|
+
</AbsoluteFill>
|
|
97
|
+
);
|
|
98
|
+
};
|