hyper-animator-codex 0.7.1 → 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 +51 -3
- package/bin/hyper-animator-codex.mjs +1 -1
- package/lib/minimax-config.mjs +3 -3
- package/package.json +1 -1
- 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,122 @@
|
|
|
1
|
+
// text-column-converge —— raycast-teams(实测素材 28–36s 段)重做版:
|
|
2
|
+
// 原片测量(1280 宽):NEW 左缘钉死 x=412,特性词右缘钉死 x=867,
|
|
3
|
+
// 两词到左右屏边距相等(412 vs 413),轮换期间间距完全不收缩;
|
|
4
|
+
// 词换到 RAYCAST 后才发生唯一一次合拢——约 1.2s ease-in-out 连续滑动
|
|
5
|
+
// (左缘 412→554 / 右缘 867→725),"NEW RAYCAST" 以屏幕中线居中定格;
|
|
6
|
+
// 定格后约 0.6s,斜体 "COMING 2026" 在下方近乎硬切浮现。
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { AbsoluteFill, Easing, interpolate, useCurrentFrame } from 'remotion';
|
|
9
|
+
|
|
10
|
+
// 词轮换表:停留帧数不均(机器节奏),全程钉在右缘,不做间距收缩
|
|
11
|
+
const STEPS: { word: string; dur: number }[] = [
|
|
12
|
+
{ word: 'LAUNCHER DESIGN', dur: 16 },
|
|
13
|
+
{ word: 'COMPACT MODE', dur: 12 },
|
|
14
|
+
{ word: 'HOTKEY RECORDER', dur: 9 },
|
|
15
|
+
{ word: 'HOTKEY TYPES', dur: 8 },
|
|
16
|
+
{ word: 'VOICE FEATURES', dur: 7 },
|
|
17
|
+
{ word: 'SETTINGS DESIGN', dur: 8 },
|
|
18
|
+
{ word: 'AI CHAT', dur: 10 },
|
|
19
|
+
{ word: 'FILE SEARCH', dur: 12 },
|
|
20
|
+
{ word: 'RAYCAST', dur: 999 }, // 最后一词:停稳后触发唯一一次合拢
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const START = 8; // 开场黑场立静
|
|
24
|
+
|
|
25
|
+
// 原片 1280 宽 → 1920 宽换算(×1.5)
|
|
26
|
+
const NEW_LEFT_EDGE = 618; // 412×1.5:NEW 左缘(= 左屏边距)
|
|
27
|
+
const WORD_RIGHT_EDGE = 1302; // 868×1.5:特性词右缘(= 右屏边距,1920-1302=618 对称)
|
|
28
|
+
|
|
29
|
+
const FS = 42; // 原片字高很小(720p 下 cap ~20px → 1080p ~30px → 字号 ~42)
|
|
30
|
+
const LSP = 3; // letterSpacing
|
|
31
|
+
// 合拢终点按本字体实际步进计算(监视器等宽:0.6em + letterSpacing),
|
|
32
|
+
// 保证 "NEW RAYCAST" 恰好一个空格咬合、整行居中于 960,不会重叠
|
|
33
|
+
const ADV = 0.6 * FS + LSP; // 每字符步进
|
|
34
|
+
const LINE_W = 11 * ADV; // "NEW RAYCAST" 共 11 字符
|
|
35
|
+
const MERGED_LEFT = 960 - LINE_W / 2; // 合拢后 NEW 左缘
|
|
36
|
+
const MERGED_RIGHT = 960 + LINE_W / 2; // 合拢后 RAYCAST 右缘
|
|
37
|
+
const CONVERGE_DUR = 36; // 合拢时长:原片 ~1.2s ≈ 36 帧
|
|
38
|
+
const CONVERGE_DELAY = 10; // RAYCAST 停稳后先静置 10 帧再合拢(原片 32.4→32.7s)
|
|
39
|
+
const SUB_DELAY = 18; // 合拢定格后 ~0.6s 出斜体小字
|
|
40
|
+
|
|
41
|
+
export const TextColumnConverge: React.FC = () => {
|
|
42
|
+
const f = useCurrentFrame();
|
|
43
|
+
const t = f - START;
|
|
44
|
+
|
|
45
|
+
// 定位当前步
|
|
46
|
+
let acc = 0;
|
|
47
|
+
let idx = 0;
|
|
48
|
+
let stepStart = 0;
|
|
49
|
+
for (let i = 0; i < STEPS.length; i++) {
|
|
50
|
+
if (t >= acc) { idx = i; stepStart = acc; }
|
|
51
|
+
acc += STEPS[i].dur;
|
|
52
|
+
}
|
|
53
|
+
const cur = STEPS[idx];
|
|
54
|
+
const isLast = idx === STEPS.length - 1;
|
|
55
|
+
const local = t - stepStart;
|
|
56
|
+
|
|
57
|
+
// 唯一一次合拢:RAYCAST 停稳 CONVERGE_DELAY 帧后,ease-in-out 连续滑动
|
|
58
|
+
const cvT = isLast ? local - CONVERGE_DELAY : -1;
|
|
59
|
+
const cv = interpolate(cvT, [0, CONVERGE_DUR], [0, 1], {
|
|
60
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
61
|
+
easing: Easing.inOut(Easing.cubic),
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// NEW 左缘:618 → 831;特性词右缘:1302 → 1088
|
|
65
|
+
const newLeft = interpolate(cv, [0, 1], [NEW_LEFT_EDGE, MERGED_LEFT]);
|
|
66
|
+
const wordRight = interpolate(cv, [0, 1], [WORD_RIGHT_EDGE, MERGED_RIGHT]);
|
|
67
|
+
|
|
68
|
+
const converged = cv >= 1;
|
|
69
|
+
|
|
70
|
+
// 斜体小字:合拢定格后 SUB_DELAY 帧,近乎硬切(4 帧快速淡入,无位移)
|
|
71
|
+
const subT = converged ? cvT - CONVERGE_DUR - SUB_DELAY : -1;
|
|
72
|
+
const subOp = interpolate(subT, [0, 4], [0, 1], {
|
|
73
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const visible = t >= 0;
|
|
77
|
+
|
|
78
|
+
const font: React.CSSProperties = {
|
|
79
|
+
fontFamily: '"SF Mono", Menlo, monospace',
|
|
80
|
+
fontWeight: 500,
|
|
81
|
+
fontSize: FS,
|
|
82
|
+
letterSpacing: 3,
|
|
83
|
+
color: '#f2f2f4',
|
|
84
|
+
whiteSpace: 'nowrap',
|
|
85
|
+
lineHeight: 1,
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<AbsoluteFill style={{ background: '#050506', overflow: 'hidden' }}>
|
|
90
|
+
{visible && (
|
|
91
|
+
<div style={{ position: 'absolute', inset: 0 }}>
|
|
92
|
+
{/* NEW:左缘定位(轮换期间钉死在左屏边距处) */}
|
|
93
|
+
<div style={{
|
|
94
|
+
...font, position: 'absolute',
|
|
95
|
+
left: newLeft, top: 519,
|
|
96
|
+
}}>
|
|
97
|
+
NEW
|
|
98
|
+
</div>
|
|
99
|
+
{/* 特性词:右缘定位(词换长换短,右缘不动) */}
|
|
100
|
+
<div style={{
|
|
101
|
+
...font, position: 'absolute',
|
|
102
|
+
right: 1920 - wordRight, top: 519,
|
|
103
|
+
}}>
|
|
104
|
+
{cur.word}
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
{/* 斜体小字:合拢后在整行正下方浮现,与整行同左缘 */}
|
|
108
|
+
<div style={{
|
|
109
|
+
...font,
|
|
110
|
+
fontStyle: 'italic',
|
|
111
|
+
color: '#d8d8dc',
|
|
112
|
+
position: 'absolute',
|
|
113
|
+
left: MERGED_LEFT, top: 519 + FS + 14,
|
|
114
|
+
opacity: subOp,
|
|
115
|
+
}}>
|
|
116
|
+
COMING 2026
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
)}
|
|
120
|
+
</AbsoluteFill>
|
|
121
|
+
);
|
|
122
|
+
};
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// 组合:命令面板 × 深浅扫场(palette-theme-ripple)
|
|
2
|
+
// FakeDashboard 静置 → 整屏压暗+blur → ⌘K 面板弹落 → 模拟输入"dark"
|
|
3
|
+
// (灰块字符逐个弹出)→ 回车帧面板 5f 收缩成一个亮点 → 深色扫场边界
|
|
4
|
+
// **从该亮点位置**荡开(clip-path 圆扩张 + 亮边缘环)扫过全 UI 变深色版 → 真静止。
|
|
5
|
+
// 组合命门:扫场起点必须是面板收缩点(960,470),收缩完成帧=扫场起始帧
|
|
6
|
+
// (RIPPLE=73),从别处/别帧开始就断了因果。
|
|
7
|
+
// 关键帧:0–15 浅色静置 → 15–22 压暗 blur → 22–30 面板弹落(超调)→
|
|
8
|
+
// 38–62 逐字输入 d/a/r/k → 68 回车 → 68–73 面板收缩成亮点 → 73–95 扫场
|
|
9
|
+
// 荡开 → 95–170 深色真静止 75f。深色版为手工反转 G 色板的本地 DarkDashboard。
|
|
10
|
+
// 帧确定,无随机源。
|
|
11
|
+
import React from 'react';
|
|
12
|
+
import { useCurrentFrame, interpolate, Easing } from 'remotion';
|
|
13
|
+
import { G, FakeDashboard } from '../_fixtures/Fixtures';
|
|
14
|
+
|
|
15
|
+
const DIM_START = 15;
|
|
16
|
+
const PANEL_IN = 22;
|
|
17
|
+
const TYPE_FRAMES = [38, 46, 54, 62]; // d a r k
|
|
18
|
+
const ENTER = 68;
|
|
19
|
+
const RIPPLE = 73; // 面板收缩完成帧 = 扫场起始帧(组合命门)
|
|
20
|
+
const RIPPLE_END = 95;
|
|
21
|
+
const ORIGIN = { x: 960, y: 470 }; // 面板中心 = 收缩点 = 扫场圆心
|
|
22
|
+
const MAX_R = 1250;
|
|
23
|
+
|
|
24
|
+
// 手工反转 G 色板的深色版
|
|
25
|
+
const D = {
|
|
26
|
+
bg: '#1a1a1c', panel: '#232325', line: '#3a3a38', bar: '#6f6f6d',
|
|
27
|
+
ink: '#e8e8e6', mid: '#7a7a78', card: '#262628', border: '#454543',
|
|
28
|
+
side: '#0e0e10', sideBar: '#555553',
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const DarkCard: React.FC<{ seed: number }> = ({ seed }) => {
|
|
32
|
+
const titleW = 45 + ((seed * 37) % 40);
|
|
33
|
+
const lines = 2 + (seed % 3);
|
|
34
|
+
return (
|
|
35
|
+
<div style={{ width: '100%', height: '100%', background: D.card, border: `2px solid ${D.border}`, borderRadius: 14, padding: 18, boxSizing: 'border-box', display: 'flex', flexDirection: 'column', gap: 10 }}>
|
|
36
|
+
<div style={{ height: 16, width: `${titleW}%`, background: D.bar, borderRadius: 8 }} />
|
|
37
|
+
{Array.from({ length: lines }).map((_, i) => (
|
|
38
|
+
<div key={i} style={{ height: 10, width: `${88 - i * 14 - (seed % 5) * 3}%`, background: D.line, borderRadius: 5 }} />
|
|
39
|
+
))}
|
|
40
|
+
<div style={{ marginTop: 'auto', display: 'flex', gap: 8, alignItems: 'center' }}>
|
|
41
|
+
<div style={{ width: 26, height: 26, borderRadius: 13, background: D.mid }} />
|
|
42
|
+
<div style={{ height: 10, width: 64, background: D.line, borderRadius: 5 }} />
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// 与 FakeDashboard variant A 布局逐像素一致的深色版——扫场读作"同一 UI 换肤"
|
|
49
|
+
const DarkDashboard: React.FC = () => (
|
|
50
|
+
<div style={{ width: 1920, height: 1080, background: D.bg, display: 'flex' }}>
|
|
51
|
+
<div style={{ width: 220, background: D.side, padding: '28px 22px', boxSizing: 'border-box', display: 'flex', flexDirection: 'column', gap: 18 }}>
|
|
52
|
+
<div style={{ width: 40, height: 40, borderRadius: 10, background: '#8a8a88' }} />
|
|
53
|
+
{Array.from({ length: 7 }).map((_, i) => (
|
|
54
|
+
<div key={i} style={{ height: 12, width: `${60 + ((i * 29) % 35)}%`, background: D.sideBar, borderRadius: 6 }} />
|
|
55
|
+
))}
|
|
56
|
+
</div>
|
|
57
|
+
<div style={{ flex: 1, display: 'flex', flexDirection: 'column' }}>
|
|
58
|
+
<div style={{ height: 72, background: D.panel, borderBottom: `2px solid ${D.line}`, display: 'flex', alignItems: 'center', padding: '0 32px', gap: 20, boxSizing: 'border-box' }}>
|
|
59
|
+
<div style={{ height: 18, width: 180, background: D.bar, borderRadius: 9 }} />
|
|
60
|
+
<div style={{ marginLeft: 'auto', height: 36, width: 320, background: D.card, border: `2px solid ${D.line}`, borderRadius: 18, boxSizing: 'border-box' }} />
|
|
61
|
+
<div style={{ width: 36, height: 36, borderRadius: 18, background: D.mid }} />
|
|
62
|
+
</div>
|
|
63
|
+
<div style={{ flex: 1, padding: 36, display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gridAutoRows: '1fr', gap: 28, boxSizing: 'border-box' }}>
|
|
64
|
+
{Array.from({ length: 6 }).map((_, i) => (
|
|
65
|
+
<DarkCard key={i} seed={i + 1} />
|
|
66
|
+
))}
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
export const PaletteThemeRipple: React.FC = () => {
|
|
73
|
+
const f = useCurrentFrame();
|
|
74
|
+
|
|
75
|
+
// 压暗 + blur:面板阶段生效,扫场完成后浅色层已被卸载
|
|
76
|
+
const dim = interpolate(f, [DIM_START, DIM_START + 7], [0, 1], {
|
|
77
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// 面板弹落(back-out 超调)
|
|
81
|
+
const panelT = interpolate(f, [PANEL_IN, PANEL_IN + 8], [0, 1], {
|
|
82
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
83
|
+
easing: Easing.out(Easing.back(1.9)),
|
|
84
|
+
});
|
|
85
|
+
// 回车后 5f 收缩成一点(ease-in,越缩越快)
|
|
86
|
+
const shrink = interpolate(f, [ENTER, RIPPLE], [1, 0], {
|
|
87
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
88
|
+
easing: Easing.in(Easing.cubic),
|
|
89
|
+
});
|
|
90
|
+
const panelMounted = f >= PANEL_IN && f < RIPPLE;
|
|
91
|
+
const panelScale = f < ENTER ? panelT : shrink;
|
|
92
|
+
const panelDropY = f < ENTER ? interpolate(panelT, [0, 1], [-120, 0]) : 0;
|
|
93
|
+
|
|
94
|
+
// 逐字输入:每个灰块 4f 内弹出
|
|
95
|
+
const charScale = (i: number) =>
|
|
96
|
+
interpolate(f, [TYPE_FRAMES[i], TYPE_FRAMES[i] + 4], [0, 1], {
|
|
97
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
98
|
+
easing: Easing.out(Easing.back(2.2)),
|
|
99
|
+
});
|
|
100
|
+
const typedCount = TYPE_FRAMES.filter((t) => f >= t).length;
|
|
101
|
+
|
|
102
|
+
// 扫场:圆从收缩点荡开(ease-out,先快后缓),边缘带亮环
|
|
103
|
+
const r = interpolate(f, [RIPPLE, RIPPLE_END], [12, MAX_R], {
|
|
104
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
105
|
+
easing: Easing.out(Easing.cubic),
|
|
106
|
+
});
|
|
107
|
+
const rippling = f >= RIPPLE && f < RIPPLE_END;
|
|
108
|
+
const done = f >= RIPPLE_END;
|
|
109
|
+
const ringOpacity = interpolate(f, [RIPPLE, RIPPLE_END], [0.95, 0], {
|
|
110
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// 亮点:收缩完成前后 3f 的高光核(把"收缩点=扫场起点"钉死给观众看)
|
|
114
|
+
const dotOn = f >= ENTER + 2 && f < RIPPLE + 3;
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<div style={{ width: 1920, height: 1080, background: D.bg, position: 'relative', overflow: 'hidden' }}>
|
|
118
|
+
{/* 浅色层:扫场完成后条件卸载(真静止) */}
|
|
119
|
+
{!done && (
|
|
120
|
+
<div style={{ position: 'absolute', inset: 0, filter: dim > 0 ? `brightness(${1 - dim * 0.45}) blur(${dim * 6}px)` : 'none' }}>
|
|
121
|
+
<FakeDashboard variant="A" />
|
|
122
|
+
</div>
|
|
123
|
+
)}
|
|
124
|
+
|
|
125
|
+
{/* 深色层:从收缩点起被圆形 clip 揭开;完成后铺满且无 clip */}
|
|
126
|
+
{(rippling || done) && (
|
|
127
|
+
<div style={{ position: 'absolute', inset: 0, clipPath: done ? 'none' : `circle(${r}px at ${ORIGIN.x}px ${ORIGIN.y}px)` }}>
|
|
128
|
+
<DarkDashboard />
|
|
129
|
+
</div>
|
|
130
|
+
)}
|
|
131
|
+
|
|
132
|
+
{/* 扫场亮边缘环 */}
|
|
133
|
+
{rippling && (
|
|
134
|
+
<div
|
|
135
|
+
style={{
|
|
136
|
+
position: 'absolute',
|
|
137
|
+
left: ORIGIN.x - r,
|
|
138
|
+
top: ORIGIN.y - r,
|
|
139
|
+
width: r * 2,
|
|
140
|
+
height: r * 2,
|
|
141
|
+
borderRadius: '50%',
|
|
142
|
+
border: '5px solid rgba(255,255,255,0.9)',
|
|
143
|
+
opacity: ringOpacity,
|
|
144
|
+
boxShadow: '0 0 40px rgba(255,255,255,0.5), inset 0 0 30px rgba(255,255,255,0.35)',
|
|
145
|
+
}}
|
|
146
|
+
/>
|
|
147
|
+
)}
|
|
148
|
+
|
|
149
|
+
{/* 收缩亮点 */}
|
|
150
|
+
{dotOn && (
|
|
151
|
+
<div
|
|
152
|
+
style={{
|
|
153
|
+
position: 'absolute',
|
|
154
|
+
left: ORIGIN.x - 11,
|
|
155
|
+
top: ORIGIN.y - 11,
|
|
156
|
+
width: 22,
|
|
157
|
+
height: 22,
|
|
158
|
+
borderRadius: 11,
|
|
159
|
+
background: '#ffffff',
|
|
160
|
+
boxShadow: '0 0 46px 14px rgba(255,255,255,0.85)',
|
|
161
|
+
}}
|
|
162
|
+
/>
|
|
163
|
+
)}
|
|
164
|
+
|
|
165
|
+
{/* ⌘K 命令面板 */}
|
|
166
|
+
{panelMounted && (
|
|
167
|
+
<div
|
|
168
|
+
style={{
|
|
169
|
+
position: 'absolute',
|
|
170
|
+
left: ORIGIN.x - 340,
|
|
171
|
+
top: ORIGIN.y - 130 + panelDropY,
|
|
172
|
+
width: 680,
|
|
173
|
+
height: 260,
|
|
174
|
+
transform: `scale(${Math.max(panelScale, 0.001)})`,
|
|
175
|
+
transformOrigin: 'center center',
|
|
176
|
+
background: G.card,
|
|
177
|
+
border: `2px solid ${G.border}`,
|
|
178
|
+
borderRadius: 18,
|
|
179
|
+
boxShadow: '0 30px 80px rgba(0,0,0,0.4)',
|
|
180
|
+
padding: 24,
|
|
181
|
+
boxSizing: 'border-box',
|
|
182
|
+
display: 'flex',
|
|
183
|
+
flexDirection: 'column',
|
|
184
|
+
gap: 16,
|
|
185
|
+
}}
|
|
186
|
+
>
|
|
187
|
+
{/* 输入行:⌘K 标识 + 逐字灰块 */}
|
|
188
|
+
<div style={{ height: 62, border: `2px solid ${G.line}`, borderRadius: 12, display: 'flex', alignItems: 'center', gap: 14, padding: '0 18px', boxSizing: 'border-box' }}>
|
|
189
|
+
<div style={{ padding: '6px 12px', borderRadius: 8, background: G.side, color: '#fff', fontFamily: 'Helvetica, Arial, sans-serif', fontWeight: 800, fontSize: 22 }}>⌘K</div>
|
|
190
|
+
{TYPE_FRAMES.map((_, i) => (
|
|
191
|
+
<div key={i} style={{ width: 30, height: 30, borderRadius: 6, background: G.ink, transform: `scale(${charScale(i)})` }} />
|
|
192
|
+
))}
|
|
193
|
+
{/* 光标:帧确定闪烁(每 8f 翻转) */}
|
|
194
|
+
<div style={{ width: 4, height: 34, background: G.ink, opacity: Math.floor(f / 8) % 2 === 0 ? 1 : 0 }} />
|
|
195
|
+
</div>
|
|
196
|
+
{/* 结果行:输入完成后首行加深表示选中 */}
|
|
197
|
+
{Array.from({ length: 3 }).map((_, i) => (
|
|
198
|
+
<div key={i} style={{ height: 44, borderRadius: 10, background: i === 0 && typedCount === 4 ? G.line : G.panel, display: 'flex', alignItems: 'center', gap: 14, padding: '0 16px', boxSizing: 'border-box' }}>
|
|
199
|
+
<div style={{ width: 24, height: 24, borderRadius: 6, background: G.mid }} />
|
|
200
|
+
<div style={{ height: 12, width: `${34 + i * 16}%`, background: G.bar, borderRadius: 6 }} />
|
|
201
|
+
</div>
|
|
202
|
+
))}
|
|
203
|
+
</div>
|
|
204
|
+
)}
|
|
205
|
+
</div>
|
|
206
|
+
);
|
|
207
|
+
};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// theme-sweep-toggle —— 深浅模式扫场
|
|
2
|
+
// 同一 dashboard 深浅两版叠放(深版手工映射 G 色板),上层深版用 clip-path
|
|
3
|
+
// polygon 15° 斜边从左上扫到右下(先快后缓),边界带 2px 亮线;
|
|
4
|
+
// 扫完深版整体 scale 0.995→1 "坐实"。f=70 后全静止(70f)。
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { useCurrentFrame, interpolate, Easing } from 'remotion';
|
|
7
|
+
|
|
8
|
+
const CL = { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' } as const;
|
|
9
|
+
|
|
10
|
+
// 浅色板 = Fixtures G;深色板手工反转映射
|
|
11
|
+
type Pal = {
|
|
12
|
+
bg: string; panel: string; line: string; bar: string;
|
|
13
|
+
mid: string; card: string; border: string; side: string; sideBar: string;
|
|
14
|
+
};
|
|
15
|
+
const LIGHT: Pal = {
|
|
16
|
+
bg: '#ececea', panel: '#f7f7f6', line: '#dcdcda', bar: '#c2c2c0',
|
|
17
|
+
mid: '#8f8f8d', card: '#ffffff', border: '#d8d8d6', side: '#3a3a3a', sideBar: '#5a5a58',
|
|
18
|
+
};
|
|
19
|
+
const DARK: Pal = {
|
|
20
|
+
bg: '#1c1c1b', panel: '#242423', line: '#3a3a38', bar: '#6e6e6c',
|
|
21
|
+
mid: '#8f8f8d', card: '#2c2c2b', border: '#454543', side: '#0f0f0e', sideBar: '#6a6a68',
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// 带色板参数的 dashboard(结构同 Fixtures.FakeDashboard variant A)
|
|
25
|
+
const Dash: React.FC<{ p: Pal }> = ({ p }) => (
|
|
26
|
+
<div style={{ width: 1920, height: 1080, background: p.bg, display: 'flex' }}>
|
|
27
|
+
<div style={{ width: 220, background: p.side, padding: '28px 22px', boxSizing: 'border-box', display: 'flex', flexDirection: 'column', gap: 18 }}>
|
|
28
|
+
<div style={{ width: 40, height: 40, borderRadius: 10, background: p.sideBar }} />
|
|
29
|
+
{Array.from({ length: 7 }).map((_, i) => (
|
|
30
|
+
<div key={i} style={{ height: 12, width: `${60 + ((i * 29) % 35)}%`, background: p.sideBar, borderRadius: 6 }} />
|
|
31
|
+
))}
|
|
32
|
+
</div>
|
|
33
|
+
<div style={{ flex: 1, display: 'flex', flexDirection: 'column' }}>
|
|
34
|
+
<div style={{ height: 72, background: p.panel, borderBottom: `2px solid ${p.line}`, display: 'flex', alignItems: 'center', padding: '0 32px', gap: 20, boxSizing: 'border-box' }}>
|
|
35
|
+
<div style={{ height: 18, width: 180, background: p.bar, borderRadius: 9 }} />
|
|
36
|
+
<div style={{ marginLeft: 'auto', height: 36, width: 320, background: p.card, border: `2px solid ${p.line}`, borderRadius: 18, boxSizing: 'border-box' }} />
|
|
37
|
+
<div style={{ width: 36, height: 36, borderRadius: 18, background: p.mid }} />
|
|
38
|
+
</div>
|
|
39
|
+
<div style={{ flex: 1, padding: 36, display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gridAutoRows: '1fr', gap: 28, boxSizing: 'border-box' }}>
|
|
40
|
+
{Array.from({ length: 6 }).map((_, i) => {
|
|
41
|
+
const titleW = 45 + (((i + 1) * 37) % 40);
|
|
42
|
+
const lines = 2 + ((i + 1) % 3);
|
|
43
|
+
return (
|
|
44
|
+
<div key={i} style={{ background: p.card, border: `2px solid ${p.border}`, borderRadius: 14, padding: 18, boxSizing: 'border-box', display: 'flex', flexDirection: 'column', gap: 10 }}>
|
|
45
|
+
<div style={{ height: 16, width: `${titleW}%`, background: p.bar, borderRadius: 8 }} />
|
|
46
|
+
{Array.from({ length: lines }).map((_, j) => (
|
|
47
|
+
<div key={j} style={{ height: 10, width: `${88 - j * 14 - ((i + 1) % 5) * 3}%`, background: p.line, borderRadius: 5 }} />
|
|
48
|
+
))}
|
|
49
|
+
<div style={{ marginTop: 'auto', display: 'flex', gap: 8, alignItems: 'center' }}>
|
|
50
|
+
<div style={{ width: 26, height: 26, borderRadius: 13, background: p.mid }} />
|
|
51
|
+
<div style={{ height: 10, width: 64, background: p.line, borderRadius: 5 }} />
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
);
|
|
55
|
+
})}
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
// 时间轴
|
|
62
|
+
const SWEEP0 = 14; // 扫场开始(前 14f 初始静置)
|
|
63
|
+
const SWEEP1 = 52; // 扫场结束
|
|
64
|
+
const SETTLE0 = 52;
|
|
65
|
+
const SETTLE1 = 64; // 坐实结束 → 之后全静止
|
|
66
|
+
|
|
67
|
+
const SLANT = 1080 * Math.tan((15 * Math.PI) / 180); // ≈ 289px,15° 斜边
|
|
68
|
+
|
|
69
|
+
export const ThemeSweepToggle: React.FC = () => {
|
|
70
|
+
const frame = useCurrentFrame();
|
|
71
|
+
|
|
72
|
+
// 边界顶端 x:先快后缓(poly(3) out);从左外扫到右外+SLANT 保证底边也扫尽
|
|
73
|
+
const p = interpolate(frame, [SWEEP0, SWEEP1], [-20, 1920 + SLANT + 40], {
|
|
74
|
+
easing: Easing.out(Easing.poly(3)),
|
|
75
|
+
...CL,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// 坐实:0.995 → 1
|
|
79
|
+
const settle = interpolate(frame, [SETTLE0, SETTLE0 + 1, SETTLE1], [1, 0.995, 1], {
|
|
80
|
+
easing: Easing.out(Easing.cubic),
|
|
81
|
+
...CL,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// 亮线透明度:扫场期间可见,扫完 6f 内淡出
|
|
85
|
+
const lineOp = interpolate(frame, [SWEEP0, SWEEP0 + 4, SWEEP1 - 4, SWEEP1 + 2], [0, 1, 1, 0], CL);
|
|
86
|
+
const sweeping = frame >= SWEEP0 && frame < SWEEP1 + 2;
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<div style={{ width: 1920, height: 1080, position: 'relative', overflow: 'hidden', background: LIGHT.bg }}>
|
|
90
|
+
{/* 底层浅色版 */}
|
|
91
|
+
<Dash p={LIGHT} />
|
|
92
|
+
{/* 上层深色版,clip-path 斜切揭出 */}
|
|
93
|
+
<div
|
|
94
|
+
style={{
|
|
95
|
+
position: 'absolute',
|
|
96
|
+
inset: 0,
|
|
97
|
+
clipPath: `polygon(0 0, ${p}px 0, ${p - SLANT}px 1080px, 0 1080px)`,
|
|
98
|
+
transform: `scale(${settle})`,
|
|
99
|
+
transformOrigin: '50% 50%',
|
|
100
|
+
}}
|
|
101
|
+
>
|
|
102
|
+
<Dash p={DARK} />
|
|
103
|
+
</div>
|
|
104
|
+
{/* 2px 亮线边界(条件卸载) */}
|
|
105
|
+
{sweeping && (
|
|
106
|
+
<div
|
|
107
|
+
style={{
|
|
108
|
+
position: 'absolute',
|
|
109
|
+
left: p - SLANT / 2 - 2,
|
|
110
|
+
top: 540 - 620,
|
|
111
|
+
width: 4,
|
|
112
|
+
height: 1240,
|
|
113
|
+
background: '#ffffff',
|
|
114
|
+
boxShadow: '0 0 18px 4px rgba(255,255,255,0.75)',
|
|
115
|
+
transform: 'rotate(15deg)',
|
|
116
|
+
transformOrigin: '50% 50%',
|
|
117
|
+
opacity: lineOp,
|
|
118
|
+
}}
|
|
119
|
+
/>
|
|
120
|
+
)}
|
|
121
|
+
</div>
|
|
122
|
+
);
|
|
123
|
+
};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// timeline-travel —— 时间轴横移(《反恐王国》式)
|
|
2
|
+
// 镜头沿水平刻度轴加速横移,v1.0/v2.0/v3.0/Today 四个刻度依次掠过,
|
|
3
|
+
// 每过刻度对应 Card 从刻度线 spring 过冲弹立 + 短停,镜头不停;
|
|
4
|
+
// 末刻度 4f 急停 + 推近 1.28×。世界层只动 translateX/scale。
|
|
5
|
+
// f0–12 初始静置;f118 起真静止 ≥42f(160f 总长)。
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import { useCurrentFrame, interpolate, Easing, spring } from 'remotion';
|
|
8
|
+
import { G, Card, TitleBlock } from '../_fixtures/Fixtures';
|
|
9
|
+
|
|
10
|
+
const W = 1920;
|
|
11
|
+
const AXIS_Y = 700;
|
|
12
|
+
const TICK_GAP = 1400; // 刻度间距(世界坐标)
|
|
13
|
+
const TICKS = [
|
|
14
|
+
{ label: 'v1.0', x: 960 },
|
|
15
|
+
{ label: 'v2.0', x: 960 + TICK_GAP },
|
|
16
|
+
{ label: 'v3.0', x: 960 + TICK_GAP * 2 },
|
|
17
|
+
{ label: 'Today', x: 960 + TICK_GAP * 3 },
|
|
18
|
+
];
|
|
19
|
+
const WORLD_W = 960 + TICK_GAP * 3 + 960;
|
|
20
|
+
|
|
21
|
+
const TRAVEL_START = 12;
|
|
22
|
+
const TRAVEL_END = 104; // 急停帧
|
|
23
|
+
const ZOOM_END = 114;
|
|
24
|
+
|
|
25
|
+
// 相机 X:in-out 但前段慢后段快(poly(3) in 为主,末端 out 急收)
|
|
26
|
+
// 用两段拼:0–0.82 加速段(Easing.in(poly(2.2))),0.82–1 急刹段
|
|
27
|
+
const camXAt = (f: number): number => {
|
|
28
|
+
const total = TICKS[3].x - 960; // 需要位移的世界距离
|
|
29
|
+
const t = interpolate(f, [TRAVEL_START, TRAVEL_END], [0, 1], {
|
|
30
|
+
extrapolateLeft: 'clamp',
|
|
31
|
+
extrapolateRight: 'clamp',
|
|
32
|
+
});
|
|
33
|
+
// 加速→巡航→急刹:分段缓动,前 15% 缓起,中段近匀加速冲刺,末 12% 急收
|
|
34
|
+
const eased = interpolate(t, [0, 0.15, 0.88, 1], [0, 0.055, 0.9, 1], {
|
|
35
|
+
easing: Easing.inOut(Easing.quad),
|
|
36
|
+
});
|
|
37
|
+
return eased * total;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// 每张卡的弹立帧:相机中心扫过该刻度的时刻(数值上预先求好,避免逐帧求逆)
|
|
41
|
+
// 通过 camXAt 反查:找到 camX == tick.x - 960 的帧
|
|
42
|
+
const popFrameOf = (tickX: number): number => {
|
|
43
|
+
for (let f = TRAVEL_START; f <= TRAVEL_END; f++) {
|
|
44
|
+
if (camXAt(f) >= tickX - 960) return f;
|
|
45
|
+
}
|
|
46
|
+
return TRAVEL_END;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const CARD_W = 360;
|
|
50
|
+
const CARD_H = 240;
|
|
51
|
+
|
|
52
|
+
const TickStop: React.FC<{ i: number; frame: number }> = ({ i, frame }) => {
|
|
53
|
+
const tick = TICKS[i];
|
|
54
|
+
const pop = popFrameOf(tick.x) - 6; // 提前 6f 起弹,掠过时正好立起
|
|
55
|
+
const s = spring({
|
|
56
|
+
frame: frame - pop,
|
|
57
|
+
fps: 30,
|
|
58
|
+
config: { damping: 11, stiffness: 160, mass: 0.9 }, // 明显过冲
|
|
59
|
+
durationInFrames: 26,
|
|
60
|
+
});
|
|
61
|
+
const appeared = frame >= pop;
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<div style={{ position: 'absolute', left: tick.x, top: 0 }}>
|
|
65
|
+
{/* 刻度竖线 */}
|
|
66
|
+
<div style={{ position: 'absolute', left: -3, top: AXIS_Y - 28, width: 6, height: 56, background: G.ink, borderRadius: 3 }} />
|
|
67
|
+
{/* 刻度标签 */}
|
|
68
|
+
<div style={{ position: 'absolute', left: -80, top: AXIS_Y + 44, width: 160, textAlign: 'center', fontFamily: 'Helvetica, Arial, sans-serif', fontWeight: 800, fontSize: 40, color: G.ink }}>
|
|
69
|
+
{tick.label}
|
|
70
|
+
</div>
|
|
71
|
+
{/* 卡片从刻度线弹立:以底边为轴 scaleY 0→1(带过冲),伴随上移 */}
|
|
72
|
+
{appeared && (
|
|
73
|
+
<div
|
|
74
|
+
style={{
|
|
75
|
+
position: 'absolute',
|
|
76
|
+
left: -CARD_W / 2,
|
|
77
|
+
top: AXIS_Y - 36 - CARD_H,
|
|
78
|
+
transform: `scaleY(${s}) scaleX(${0.6 + 0.4 * s})`,
|
|
79
|
+
transformOrigin: '50% 100%',
|
|
80
|
+
opacity: Math.min(1, s * 2),
|
|
81
|
+
}}
|
|
82
|
+
>
|
|
83
|
+
<Card w={CARD_W} h={CARD_H} seed={i + 2} />
|
|
84
|
+
</div>
|
|
85
|
+
)}
|
|
86
|
+
</div>
|
|
87
|
+
);
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const TimelineTravel: React.FC = () => {
|
|
91
|
+
const frame = useCurrentFrame();
|
|
92
|
+
const camX = camXAt(frame);
|
|
93
|
+
|
|
94
|
+
// 急停后推近末刻度:scale 1 → 1.28,中心对准 Today 刻度
|
|
95
|
+
const zoom = interpolate(frame, [TRAVEL_END, ZOOM_END], [1, 1.28], {
|
|
96
|
+
easing: Easing.out(Easing.cubic),
|
|
97
|
+
extrapolateLeft: 'clamp',
|
|
98
|
+
extrapolateRight: 'clamp',
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
return (
|
|
102
|
+
<div style={{ width: W, height: 1080, background: G.bg, overflow: 'hidden', position: 'relative' }}>
|
|
103
|
+
{/* 推近层:以画面中央偏下(末刻度落点)为原点放大 */}
|
|
104
|
+
<div style={{ width: W, height: 1080, transform: `scale(${zoom})`, transformOrigin: '50% 62%' }}>
|
|
105
|
+
{/* 世界层:唯一横移的容器 */}
|
|
106
|
+
<div style={{ position: 'absolute', left: 0, top: 0, width: WORLD_W, height: 1080, transform: `translateX(${-camX}px)` }}>
|
|
107
|
+
{/* 主轴线 */}
|
|
108
|
+
<div style={{ position: 'absolute', left: 200, top: AXIS_Y - 3, width: WORLD_W - 400, height: 6, background: G.bar, borderRadius: 3 }} />
|
|
109
|
+
{/* 次刻度(小点,增强速度感) */}
|
|
110
|
+
{Array.from({ length: 22 }).map((_, i) => (
|
|
111
|
+
<div key={i} style={{ position: 'absolute', left: 960 + i * (TICK_GAP / 5) - 2, top: AXIS_Y - 12, width: 4, height: 24, background: G.bar, borderRadius: 2 }} />
|
|
112
|
+
))}
|
|
113
|
+
{TICKS.map((_, i) => (
|
|
114
|
+
<TickStop key={i} i={i} frame={frame} />
|
|
115
|
+
))}
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
<div style={{ position: 'absolute', top: 90, width: '100%', textAlign: 'center' }}>
|
|
119
|
+
<TitleBlock text="TIMELINE TRAVEL" size={64} />
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
);
|
|
123
|
+
};
|