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,120 @@
|
|
|
1
|
+
// 套印错位冲击帧(riso-misregistration-hit)——标题撞停瞬间裂成两份单色"印版"
|
|
2
|
+
// (浅灰琥珀版 G.mid + 深墨版 G.ink,mix-blend-mode: multiply 叠加),像 riso 印刷
|
|
3
|
+
// 没对准版;两版反向错位(x 为主 y 少量)做衰减震荡 offset = A*cos(ωt)*exp(-t/τ)
|
|
4
|
+
// 抖两下,帧 72 啪地硬切回单一正体(套准合一),带 4f scale 1.03→1 脉冲收束。
|
|
5
|
+
// 结构:0–19f 空场 hold(只有底部装饰线);20–28f 标题从右画外 Easing.in(cubic)
|
|
6
|
+
// 撞入屏心(帧 28 命中);28–71f 双版错位震荡;72–75f 套准脉冲;76–119f 真静止 44f。
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { useCurrentFrame, interpolate, Easing } from 'remotion';
|
|
9
|
+
import { G, TitleBlock } from '../_fixtures/Fixtures';
|
|
10
|
+
|
|
11
|
+
const HIT = 28; // 撞停命中帧
|
|
12
|
+
const SNAP = 72; // 套准合一帧
|
|
13
|
+
const AX = 16; // 单版 x 错位振幅(两版反向 → 总分离 ~32px,肉眼明显)
|
|
14
|
+
const AY = 7; // 单版 y 错位振幅(少量,更像没对准版)
|
|
15
|
+
const OMEGA = (2 * Math.PI) / 18; // 震荡周期 18f,44f 内抖两下半
|
|
16
|
+
const TAU = 60; // 缓衰减:帧 72 前仍余 ~14px 总分离,被"啪地"硬切归零
|
|
17
|
+
|
|
18
|
+
// 与 TitleBlock 同字形的可调色标题(错位印版需要单色副本)
|
|
19
|
+
const Plate: React.FC<{ color: string; dx: number; dy: number }> = ({ color, dx, dy }) => (
|
|
20
|
+
<div
|
|
21
|
+
style={{
|
|
22
|
+
position: 'absolute',
|
|
23
|
+
inset: 0,
|
|
24
|
+
display: 'flex',
|
|
25
|
+
alignItems: 'center',
|
|
26
|
+
justifyContent: 'center',
|
|
27
|
+
transform: `translate(${dx}px, ${dy}px)`,
|
|
28
|
+
mixBlendMode: 'multiply',
|
|
29
|
+
}}
|
|
30
|
+
>
|
|
31
|
+
<div
|
|
32
|
+
style={{
|
|
33
|
+
fontFamily: 'Helvetica, Arial, sans-serif',
|
|
34
|
+
fontWeight: 800,
|
|
35
|
+
fontSize: 200,
|
|
36
|
+
color,
|
|
37
|
+
letterSpacing: -1,
|
|
38
|
+
whiteSpace: 'nowrap',
|
|
39
|
+
}}
|
|
40
|
+
>
|
|
41
|
+
IMPACT
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
export const RisoMisregistrationHit: React.FC = () => {
|
|
47
|
+
const frame = useCurrentFrame();
|
|
48
|
+
|
|
49
|
+
// 阶段判定
|
|
50
|
+
const entering = frame >= 20 && frame < HIT; // 撞入
|
|
51
|
+
const split = frame >= HIT && frame < SNAP; // 双版错位震荡
|
|
52
|
+
const showSingle = frame < HIT || frame >= SNAP; // 正体(画外/撞入/套准后)
|
|
53
|
+
|
|
54
|
+
// 撞入位移:右画外 1400px → 0,8f Easing.in(cubic)(加速撞停)
|
|
55
|
+
const slideX = interpolate(frame, [20, HIT], [1400, 0], {
|
|
56
|
+
easing: Easing.in(Easing.cubic),
|
|
57
|
+
extrapolateLeft: 'clamp',
|
|
58
|
+
extrapolateRight: 'clamp',
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// 错位震荡包络:t 自命中起,衰减余弦(帧 72 前仍有可见残余,硬切归零成"啪")
|
|
62
|
+
const t = frame - HIT;
|
|
63
|
+
const m = split ? Math.cos(OMEGA * t) * Math.exp(-t / TAU) : 0;
|
|
64
|
+
const dx = AX * m;
|
|
65
|
+
const dy = AY * m;
|
|
66
|
+
|
|
67
|
+
// 套准合一脉冲:帧 72 起 4f scale 1.03 → 1,之后精确 1(保证结尾真静止)
|
|
68
|
+
const pulse =
|
|
69
|
+
frame >= SNAP && frame < SNAP + 4 ? 1 + 0.03 * (1 - (frame - SNAP) / 4) : 1;
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<div
|
|
73
|
+
style={{
|
|
74
|
+
width: 1920,
|
|
75
|
+
height: 1080,
|
|
76
|
+
background: G.bg,
|
|
77
|
+
position: 'relative',
|
|
78
|
+
overflow: 'hidden',
|
|
79
|
+
}}
|
|
80
|
+
>
|
|
81
|
+
{/* 底部装饰线:全程静止的布景锚点 */}
|
|
82
|
+
<div
|
|
83
|
+
style={{
|
|
84
|
+
position: 'absolute',
|
|
85
|
+
left: 510,
|
|
86
|
+
top: 740,
|
|
87
|
+
width: 900,
|
|
88
|
+
height: 6,
|
|
89
|
+
borderRadius: 3,
|
|
90
|
+
background: G.bar,
|
|
91
|
+
}}
|
|
92
|
+
/>
|
|
93
|
+
|
|
94
|
+
{/* 正体:画外等待 / 撞入 / 套准后(撞入前 frame<20 时在画外,视觉等同空场) */}
|
|
95
|
+
{showSingle && (
|
|
96
|
+
<div
|
|
97
|
+
style={{
|
|
98
|
+
position: 'absolute',
|
|
99
|
+
inset: 0,
|
|
100
|
+
display: 'flex',
|
|
101
|
+
alignItems: 'center',
|
|
102
|
+
justifyContent: 'center',
|
|
103
|
+
transform: `translateX(${entering || frame < 20 ? slideX : 0}px) scale(${pulse})`,
|
|
104
|
+
transformOrigin: 'center center',
|
|
105
|
+
}}
|
|
106
|
+
>
|
|
107
|
+
<TitleBlock text="IMPACT" size={200} />
|
|
108
|
+
</div>
|
|
109
|
+
)}
|
|
110
|
+
|
|
111
|
+
{/* 双版错位:浅灰版与深墨版反向偏移,multiply 叠加出"重影套印" */}
|
|
112
|
+
{split && (
|
|
113
|
+
<>
|
|
114
|
+
<Plate color={G.mid} dx={-dx} dy={dy} />
|
|
115
|
+
<Plate color={G.ink} dx={dx} dy={-dy} />
|
|
116
|
+
</>
|
|
117
|
+
)}
|
|
118
|
+
</div>
|
|
119
|
+
);
|
|
120
|
+
};
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
// runway-ground-skim v5 —— 源片 clickup-30.mp4 约 46–50s(clickup10 截图 5 张):
|
|
2
|
+
// 用户 v5 意见(逐字):"去掉落地后弹起的效果,然后整个下落的过程快一点"
|
|
3
|
+
// 落实:①删除落地压弹——着地即停,零回弹零压缩(判例:掉落感=干脆利落);
|
|
4
|
+
// ②下落整体提速——单卡下落 15→9 帧,全员落定 f45→f33,立起段随之前移;
|
|
5
|
+
// ③保留项不动:错峰 3 帧起点、界面位置顺序(行优先左→右)、重力加速
|
|
6
|
+
// (距离∝t²)、贴落完成后页面立起转正收尾。
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { AbsoluteFill, interpolate, useCurrentFrame, Easing } from 'remotion';
|
|
9
|
+
|
|
10
|
+
const FONT = 'Helvetica, Arial, sans-serif';
|
|
11
|
+
const INK = '#3c3c42';
|
|
12
|
+
const MID = '#8d8d94';
|
|
13
|
+
const FAINT = '#d2d2d5';
|
|
14
|
+
|
|
15
|
+
const easeRise = Easing.bezier(0.42, 0, 0.16, 1);
|
|
16
|
+
|
|
17
|
+
/* mulberry32 带种子(起跳节奏 ≤1.5 帧微差 < 3 帧错峰,顺序不乱) */
|
|
18
|
+
const mulberry32 = (seed: number) => () => {
|
|
19
|
+
seed |= 0; seed = (seed + 0x6d2b79f5) | 0;
|
|
20
|
+
let t = Math.imul(seed ^ (seed >>> 15), 1 | seed);
|
|
21
|
+
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
|
|
22
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const CARD_W = 760;
|
|
26
|
+
const MiniCardFace: React.FC<{ title: string; sub: string }> = ({ title, sub }) => (
|
|
27
|
+
<div style={{
|
|
28
|
+
width: CARD_W, border: `4px solid ${FAINT}`, borderRadius: 22, padding: '30px 40px',
|
|
29
|
+
background: '#fcfcfb', display: 'flex', flexDirection: 'column', gap: 14, boxSizing: 'border-box',
|
|
30
|
+
}}>
|
|
31
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: 24 }}>
|
|
32
|
+
<div style={{ width: 40, height: 40, border: '6px solid #85858b', borderRadius: 8, flexShrink: 0 }} />
|
|
33
|
+
<div style={{ fontFamily: FONT, fontSize: 46, color: INK, fontWeight: 650, whiteSpace: 'nowrap' }}>{title}</div>
|
|
34
|
+
</div>
|
|
35
|
+
<div style={{ fontFamily: FONT, fontSize: 36, color: MID, paddingLeft: 64, whiteSpace: 'nowrap' }}>{sub}</div>
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
/* 界面位置顺序 = 数组顺序:第一行左→右,再第二行左→右 */
|
|
40
|
+
const CARDS: { title: string; sub: string; col: number; row: number }[] = [
|
|
41
|
+
{ title: 'Creative Refresh', sub: 'New logo exploration', col: 0, row: 0 },
|
|
42
|
+
{ title: 'New Bugs Per Week', sub: 'Bug tracker Dashboard', col: 1, row: 0 },
|
|
43
|
+
{ title: 'Tiger Team Roadmap', sub: 'Roadmap Outline', col: 2, row: 0 },
|
|
44
|
+
{ title: 'Design System', sub: 'Design Handbook Inspo', col: 3, row: 0 },
|
|
45
|
+
{ title: 'Development Sprint Dashboard', sub: 'Dev Team Sprints', col: 0, row: 1 },
|
|
46
|
+
{ title: 'CSS Bug Tracker', sub: 'Query Reports', col: 1, row: 1 },
|
|
47
|
+
{ title: 'Platform', sub: 'System Health Monitor', col: 2, row: 1 },
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
/* Recent 网格槽位(面板内容坐标) */
|
|
51
|
+
const GRID_X = 1180, GRID_Y = 760, COL_GAP = 850, ROW_GAP = 250;
|
|
52
|
+
const slotPos = (col: number, row: number) => ({ x: GRID_X + col * COL_GAP, y: GRID_Y + row * ROW_GAP });
|
|
53
|
+
|
|
54
|
+
/* 平躺地面:Home 仪表盘(卡片槽位留空,由悬浮卡片落入) */
|
|
55
|
+
const Ground: React.FC = () => (
|
|
56
|
+
<div style={{ width: 4600, height: 2600, background: '#f6f6f5', borderRadius: 60, position: 'relative', overflow: 'hidden' }}>
|
|
57
|
+
<div style={{ display: 'flex', height: '100%' }}>
|
|
58
|
+
{/* 左侧栏 */}
|
|
59
|
+
<div style={{ width: 860, borderRight: `4px solid ${FAINT}`, padding: '70px 60px 0', background: '#f1f1f0' }}>
|
|
60
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: 26 }}>
|
|
61
|
+
<div style={{ width: 64, height: 64, borderRadius: 18, background: 'linear-gradient(135deg,#adadb3,#6b6b72)' }} />
|
|
62
|
+
<div style={{ fontFamily: FONT, fontSize: 56, fontWeight: 800, color: INK }}>ClickUp</div>
|
|
63
|
+
</div>
|
|
64
|
+
<div style={{ height: 46 }} />
|
|
65
|
+
{['Home', 'Inbox', 'Company', 'People & Teams', 'Goals', 'Docs', 'More'].map((t, i) => (
|
|
66
|
+
<div key={t} style={{
|
|
67
|
+
display: 'flex', alignItems: 'center', gap: 30, height: 108, paddingLeft: 32,
|
|
68
|
+
background: i === 0 ? '#e6e6f0' : 'transparent', borderRadius: 20,
|
|
69
|
+
}}>
|
|
70
|
+
<div style={{ width: 36, height: 36, border: '6px solid #90909a', borderRadius: 9 }} />
|
|
71
|
+
<div style={{ fontFamily: FONT, fontSize: 46, color: INK, fontWeight: i === 0 ? 650 : 400 }}>{t}</div>
|
|
72
|
+
</div>
|
|
73
|
+
))}
|
|
74
|
+
<div style={{ height: 60 }} />
|
|
75
|
+
<div style={{ fontFamily: FONT, fontSize: 38, letterSpacing: 5, color: MID, fontWeight: 600, paddingLeft: 32 }}>SPACES</div>
|
|
76
|
+
<div style={{ height: 16 }} />
|
|
77
|
+
{['EPD', 'Product roadmap', 'Design', 'Designer handbook', '3.0', 'Design system'].map((t) => (
|
|
78
|
+
<div key={t} style={{ display: 'flex', alignItems: 'center', gap: 30, height: 96, paddingLeft: 32 }}>
|
|
79
|
+
<div style={{ width: 44, height: 44, borderRadius: 12, background: '#d6d6da' }} />
|
|
80
|
+
<div style={{ fontFamily: FONT, fontSize: 42, color: INK }}>{t}</div>
|
|
81
|
+
</div>
|
|
82
|
+
))}
|
|
83
|
+
</div>
|
|
84
|
+
{/* 主区 */}
|
|
85
|
+
<div style={{ flex: 1, padding: '70px 100px 0', position: 'relative' }}>
|
|
86
|
+
{/* 顶部 tab 条 */}
|
|
87
|
+
<div style={{ display: 'flex', gap: 110, fontFamily: FONT, fontSize: 42, color: MID, marginBottom: 60 }}>
|
|
88
|
+
<div>Product analytics</div><div style={{ fontWeight: 700, color: INK }}>ClickUp 3.0</div>
|
|
89
|
+
<div>Widget brainstorm</div><div>Design system</div><div>Design</div>
|
|
90
|
+
</div>
|
|
91
|
+
<div style={{ fontFamily: FONT, fontSize: 110, fontWeight: 750, color: INK }}>Home</div>
|
|
92
|
+
<div style={{ height: 40 }} />
|
|
93
|
+
<div style={{
|
|
94
|
+
display: 'flex', alignItems: 'center', gap: 30, border: `4px solid ${FAINT}`,
|
|
95
|
+
borderRadius: 24, padding: '28px 42px', background: '#fff', width: 1400,
|
|
96
|
+
}}>
|
|
97
|
+
<div style={{ width: 38, height: 38, borderRadius: 19, border: '6px solid #9a9aa0' }} />
|
|
98
|
+
<div style={{ fontFamily: FONT, fontSize: 42, color: MID }}>Search by app, filetype, or keyword</div>
|
|
99
|
+
</div>
|
|
100
|
+
<div style={{ height: 66 }} />
|
|
101
|
+
<div style={{ display: 'flex', gap: 70, fontFamily: FONT, fontSize: 46 }}>
|
|
102
|
+
<div style={{ color: INK, fontWeight: 700 }}>Recent</div>
|
|
103
|
+
<div style={{ color: MID }}>Favorites</div>
|
|
104
|
+
</div>
|
|
105
|
+
{/* ↑ Recent 网格槽位区域留空(卡片从空中落入 GRID_X/GRID_Y 起的两行四列) */}
|
|
106
|
+
<div style={{ height: 560 }} />
|
|
107
|
+
<div style={{ display: 'flex', gap: 70, fontFamily: FONT, fontSize: 44 }}>
|
|
108
|
+
<div style={{ color: INK, fontWeight: 700 }}>Todo</div>
|
|
109
|
+
<div style={{ color: MID }}>Comments</div>
|
|
110
|
+
<div style={{ color: MID }}>Done</div>
|
|
111
|
+
<div style={{ color: MID }}>Delegated</div>
|
|
112
|
+
</div>
|
|
113
|
+
<div style={{ height: 36 }} />
|
|
114
|
+
<div style={{
|
|
115
|
+
display: 'inline-block', padding: '16px 40px', background: '#e4e4e3', borderRadius: 14,
|
|
116
|
+
fontFamily: FONT, fontSize: 36, letterSpacing: 4, color: '#6f6f75', fontWeight: 600,
|
|
117
|
+
}}>TODAY</div>
|
|
118
|
+
<div style={{ height: 40 }} />
|
|
119
|
+
{['New Bugs Per Week', 'Designer handbook', 'Mobile screens', 'Product roadmap'].map((t) => (
|
|
120
|
+
<div key={t} style={{
|
|
121
|
+
display: 'flex', alignItems: 'center', gap: 34, height: 118,
|
|
122
|
+
borderBottom: '3px solid #e5e5e3', width: 2600,
|
|
123
|
+
}}>
|
|
124
|
+
<div style={{ width: 32, height: 32, borderRadius: 9, background: '#c04a6e' }} />
|
|
125
|
+
<div style={{ fontFamily: FONT, fontSize: 46, color: INK, fontWeight: 550 }}>{t}</div>
|
|
126
|
+
<div style={{ marginLeft: 'auto', width: 180, height: 16, background: '#e3e3e8', borderRadius: 8 }} />
|
|
127
|
+
</div>
|
|
128
|
+
))}
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
export const RunwayGroundSkim: React.FC = () => {
|
|
135
|
+
const frame = useCurrentFrame();
|
|
136
|
+
const rand = mulberry32(20260718);
|
|
137
|
+
const jit = CARDS.map(() => rand() * 1.2); // ≤1.2 帧微差 < 3 帧错峰,顺序绝不乱
|
|
138
|
+
|
|
139
|
+
/* ---- 节奏(掉落提速+着地即停版,118 帧)----
|
|
140
|
+
* f0–6 开场:全员悬空在黑色空域
|
|
141
|
+
* f6–33 掉落:第 i 张起跳 f = 6 + i*3(错峰只差 3 帧),下落 9 帧
|
|
142
|
+
* ⇒ 9 >> 3,空中同时 3–4 张在落(重叠并行,非串行等待);
|
|
143
|
+
* 重力加速(距离∝t²),着地即停——零回弹零压缩
|
|
144
|
+
* f38–94 页面立起 + 视角转正(rotateX 66→0,镜头拉远居中)
|
|
145
|
+
* f94–118 终态正视整页 hold */
|
|
146
|
+
// v6(批次 15):用户意见"下落的时间差多调小一些,不需要一个落下了
|
|
147
|
+
// 再启动第二个"——起点差 3→1.5 帧(9 帧下落窗口重叠度 6 倍,
|
|
148
|
+
// 任意时刻空中 5–6 张同落,几乎齐落带涟漪感)
|
|
149
|
+
const START0 = 6, GAP = 1.5, FALLF = 9;
|
|
150
|
+
|
|
151
|
+
const lifts = CARDS.map((c, i) => {
|
|
152
|
+
const t = frame - (START0 + i * GAP + jit[i]);
|
|
153
|
+
const H = 560 + (i % 3) * 160; // 初始悬浮高度错落
|
|
154
|
+
if (t <= 0) return H;
|
|
155
|
+
const p = t / FALLF;
|
|
156
|
+
if (p < 1) return H * (1 - p * p); // 重力加速:下落距离 ∝ t²
|
|
157
|
+
return 0; // 着地即停,无弹起
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
/* 立起段进度 */
|
|
161
|
+
const riseP = interpolate(frame, [38, 94], [0, 1], { easing: easeRise, extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
|
|
162
|
+
|
|
163
|
+
/* 镜头:落卡段轻微推进(72→66°),立起段转正(→0°)并拉远居中 */
|
|
164
|
+
const landP = interpolate(frame, [0, 34], [0, 1], { easing: Easing.bezier(0.3, 0.1, 0.6, 0.9), extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
|
|
165
|
+
const rx = interpolate(landP, [0, 1], [72, 66]) - 66 * riseP;
|
|
166
|
+
const z = interpolate(landP, [0, 1], [-620, -320]) + riseP * (-1620 - -320);
|
|
167
|
+
const bright = interpolate(frame, [0, 32, 86], [0.32, 0.8, 1.0], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
|
|
168
|
+
|
|
169
|
+
/* 锚点/透视原点随立起归中:终态整页入画、中心≈画面中心 */
|
|
170
|
+
const anchorTop = 58 - riseP * 6; // % :58 → 52(终态整页不裁底)
|
|
171
|
+
const perspY = 30 + riseP * 20; // % :30 → 50
|
|
172
|
+
|
|
173
|
+
const cam = (children: React.ReactNode, extra?: React.CSSProperties) => (
|
|
174
|
+
<AbsoluteFill style={{ perspective: 1050, perspectiveOrigin: `50% ${perspY}%`, ...extra }}>
|
|
175
|
+
<div style={{
|
|
176
|
+
position: 'absolute', left: '50%', top: `${anchorTop}%`, width: 0, height: 0,
|
|
177
|
+
transformStyle: 'preserve-3d',
|
|
178
|
+
transform: `translateZ(${z}px) rotateX(${rx}deg)`,
|
|
179
|
+
}}>
|
|
180
|
+
{children}
|
|
181
|
+
</div>
|
|
182
|
+
</AbsoluteFill>
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
const scene = (
|
|
186
|
+
<div style={{ position: 'absolute', transformStyle: 'preserve-3d', transform: 'translate(-2300px, -1500px)' }}>
|
|
187
|
+
{/* 地面 */}
|
|
188
|
+
<div style={{ filter: `brightness(${bright})` }}>
|
|
189
|
+
<Ground />
|
|
190
|
+
</div>
|
|
191
|
+
{/* 地面上的软影(z≈0,卡片同形,随悬浮高度变化大小/偏移/浓度) */}
|
|
192
|
+
{CARDS.map((c, i) => {
|
|
193
|
+
const h = lifts[i];
|
|
194
|
+
if (h < 2) return null;
|
|
195
|
+
const s = slotPos(c.col, c.row);
|
|
196
|
+
return (
|
|
197
|
+
<div key={'sh' + i} style={{
|
|
198
|
+
position: 'absolute', left: s.x + 20, top: s.y + 14, width: CARD_W - 40, height: 150,
|
|
199
|
+
transform: `translateZ(1px) translate(${h * 0.08}px, ${h * 0.12}px) scale(${1 + h * 0.0004})`,
|
|
200
|
+
background: 'rgba(10,8,16,0.9)', borderRadius: 24,
|
|
201
|
+
filter: `blur(${10 + h * 0.03}px)`,
|
|
202
|
+
opacity: Math.max(0.12, 0.38 - h * 0.0003),
|
|
203
|
+
}} />
|
|
204
|
+
);
|
|
205
|
+
})}
|
|
206
|
+
{/* 悬空卡片:与地面同向平躺,translateZ 抬高,落回槽位。
|
|
207
|
+
空中时被"追光"打亮(比暗地面亮),落地融入地面亮度 */}
|
|
208
|
+
{CARDS.map((c, i) => {
|
|
209
|
+
const h = lifts[i];
|
|
210
|
+
const s = slotPos(c.col, c.row);
|
|
211
|
+
const airLit = h > 2 ? Math.max(1.35, bright) : bright;
|
|
212
|
+
return (
|
|
213
|
+
<div key={'card' + i} style={{
|
|
214
|
+
position: 'absolute', left: s.x, top: s.y,
|
|
215
|
+
transform: `translateZ(${h}px)`,
|
|
216
|
+
filter: `brightness(${airLit})`,
|
|
217
|
+
boxShadow: h > 2 ? `0 0 ${30 + h * 0.05}px rgba(240,235,255,${Math.min(0.3, h * 0.0004)})` : 'none',
|
|
218
|
+
}}>
|
|
219
|
+
<MiniCardFace title={c.title} sub={c.sub} />
|
|
220
|
+
</div>
|
|
221
|
+
);
|
|
222
|
+
})}
|
|
223
|
+
</div>
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
/* 立起段各氛围层收敛:黑空域压顶/地平线光/近景糊都随转正淡出 */
|
|
227
|
+
const airOp = 1 - riseP;
|
|
228
|
+
|
|
229
|
+
return (
|
|
230
|
+
<AbsoluteFill style={{ background: '#07060a' }}>
|
|
231
|
+
{/* 地平线微光(转正后消失) */}
|
|
232
|
+
<AbsoluteFill style={{
|
|
233
|
+
background: `radial-gradient(ellipse 60% 14% at 50% 40%, rgba(190,170,255,${(0.16 + landP * 0.1) * airOp}), transparent 75%)`,
|
|
234
|
+
}} />
|
|
235
|
+
{cam(scene)}
|
|
236
|
+
{/* 近景轻糊(转正后消失) */}
|
|
237
|
+
{airOp > 0.02 && (
|
|
238
|
+
<AbsoluteFill style={{
|
|
239
|
+
filter: 'blur(10px) brightness(0.88)', opacity: airOp,
|
|
240
|
+
WebkitMaskImage: 'linear-gradient(180deg, transparent 60%, rgba(0,0,0,0.7) 84%, black 98%)',
|
|
241
|
+
maskImage: 'linear-gradient(180deg, transparent 60%, rgba(0,0,0,0.7) 84%, black 98%)',
|
|
242
|
+
}}>
|
|
243
|
+
{cam(scene)}
|
|
244
|
+
</AbsoluteFill>
|
|
245
|
+
)}
|
|
246
|
+
{/* 上半空域压黑(随立起淡出) */}
|
|
247
|
+
<AbsoluteFill style={{
|
|
248
|
+
background: 'linear-gradient(180deg, rgba(4,3,8,0.9) 0%, rgba(4,3,8,0.35) 16%, transparent 32%)',
|
|
249
|
+
opacity: airOp, pointerEvents: 'none',
|
|
250
|
+
}} />
|
|
251
|
+
{/* 暗角(转正后减弱不消失) */}
|
|
252
|
+
<AbsoluteFill style={{
|
|
253
|
+
background: 'radial-gradient(ellipse 95% 90% at 50% 55%, transparent 50%, rgba(3,2,7,0.55) 85%, rgba(2,1,5,0.88) 100%)',
|
|
254
|
+
opacity: 1 - riseP * 0.55, pointerEvents: 'none',
|
|
255
|
+
}} />
|
|
256
|
+
</AbsoluteFill>
|
|
257
|
+
);
|
|
258
|
+
};
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// sakuga-timing-shift —— 一拍三转一拍一(作画打拍切换)
|
|
2
|
+
// 0–48f:驱动帧 q = floor(f/3)*3,卡从左侧顿挫横移到右侧(10fps 手翻书感),
|
|
3
|
+
// 每步 ≈74px + rotate 摆动 = 一拍三的钝感;48f 切换点后改用原始 f 连续驱动,
|
|
4
|
+
// 48–75f 丝滑冲刺折返中央(out-poly(4) 高初速 + 运动拉伸 scaleX + 残影),
|
|
5
|
+
// 过冲 36px 后 3f 回弹落位。左上角标 "on 3s"/"on 1s" 随段切换并带 line-boil
|
|
6
|
+
// (boil 在 f=108 后冻结)。收尾真静止 ≥40f。
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { useCurrentFrame, interpolate, Easing } from 'remotion';
|
|
9
|
+
import { G, Card, TitleBlock } from '../_fixtures/Fixtures';
|
|
10
|
+
|
|
11
|
+
const W = 1920;
|
|
12
|
+
const CARD_W = 420;
|
|
13
|
+
const CARD_H = 260;
|
|
14
|
+
const CARD_Y = (1080 - CARD_H) / 2; // 410
|
|
15
|
+
|
|
16
|
+
const X_LEFT = 120;
|
|
17
|
+
const X_RIGHT = 1380; // 卡左缘,右侧停点
|
|
18
|
+
const X_CENTER = (W - CARD_W) / 2; // 750,中央落位
|
|
19
|
+
const OVERSHOOT = 36;
|
|
20
|
+
|
|
21
|
+
const SWITCH = 48; // 打拍切换帧
|
|
22
|
+
const ARRIVE = 70; // 冲刺到过冲点
|
|
23
|
+
const SETTLE = 75; // 回弹落位完成
|
|
24
|
+
|
|
25
|
+
// 段一:一拍三。位置函数线性,但只在 q = floor(f/3)*3 上取值。
|
|
26
|
+
const pos1 = (t: number): number =>
|
|
27
|
+
interpolate(t, [0, SWITCH], [X_LEFT, X_RIGHT], {
|
|
28
|
+
extrapolateLeft: 'clamp',
|
|
29
|
+
extrapolateRight: 'clamp',
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// 段二:一拍一。out-poly(4) 高初速冲刺 → 过冲 → 3f 回弹。
|
|
33
|
+
const pos2 = (t: number): number =>
|
|
34
|
+
interpolate(t, [SWITCH, ARRIVE, SETTLE], [X_RIGHT, X_CENTER - OVERSHOOT, X_CENTER], {
|
|
35
|
+
easing: Easing.out(Easing.poly(4)),
|
|
36
|
+
extrapolateLeft: 'clamp',
|
|
37
|
+
extrapolateRight: 'clamp',
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export const SakugaTimingShift: React.FC = () => {
|
|
41
|
+
const f = useCurrentFrame();
|
|
42
|
+
const onThrees = f < SWITCH;
|
|
43
|
+
|
|
44
|
+
// ---- 卡片位置 ----
|
|
45
|
+
const q = Math.floor(f / 3) * 3; // 一拍三驱动帧
|
|
46
|
+
const x = onThrees ? pos1(q) : pos2(f);
|
|
47
|
+
|
|
48
|
+
// 顿挫段 rotate 摆动(随 q 冻结,一步一个姿势)
|
|
49
|
+
const rot = onThrees
|
|
50
|
+
? Math.sin(q * 0.7) * 5
|
|
51
|
+
: interpolate(f, [SWITCH, SWITCH + 8], [Math.sin(SWITCH * 0.7) * 5, 0], {
|
|
52
|
+
extrapolateLeft: 'clamp',
|
|
53
|
+
extrapolateRight: 'clamp',
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// 冲刺段速度(位置差分,帧时间解耦)→ 运动拉伸
|
|
57
|
+
const v = onThrees ? 0 : Math.abs(pos2(f) - pos2(f - 1));
|
|
58
|
+
const sFac = Math.min(v / 55, 1);
|
|
59
|
+
const stretchX = 1 + 0.35 * sFac; // 峰值 ≈1.35,横向拉丝
|
|
60
|
+
const stretchY = 1 - 0.12 * sFac;
|
|
61
|
+
|
|
62
|
+
// 落位急停回弹:72–78f scaleX 压扁再回 1
|
|
63
|
+
const sqX = interpolate(f, [SETTLE - 3, SETTLE, SETTLE + 3], [1, 0.9, 1], {
|
|
64
|
+
easing: Easing.out(Easing.cubic),
|
|
65
|
+
extrapolateLeft: 'clamp',
|
|
66
|
+
extrapolateRight: 'clamp',
|
|
67
|
+
});
|
|
68
|
+
const sqY = interpolate(f, [SETTLE - 3, SETTLE, SETTLE + 3], [1, 1.07, 1], {
|
|
69
|
+
easing: Easing.out(Easing.cubic),
|
|
70
|
+
extrapolateLeft: 'clamp',
|
|
71
|
+
extrapolateRight: 'clamp',
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// 冲刺残影:只在段二速度高时挂载(条件挂载,不留 opacity 0 的壳)
|
|
75
|
+
const ghosts =
|
|
76
|
+
!onThrees && f > SWITCH + 1 && f < ARRIVE + 2 && sFac > 0.15
|
|
77
|
+
? [
|
|
78
|
+
{ xg: pos2(f - 2), op: 0.28 * sFac },
|
|
79
|
+
{ xg: pos2(f - 4), op: 0.13 * sFac },
|
|
80
|
+
]
|
|
81
|
+
: [];
|
|
82
|
+
|
|
83
|
+
// ---- 角标 "on 3s" / "on 1s",line-boil,f=108 后冻结 ----
|
|
84
|
+
const h = (n: number) => {
|
|
85
|
+
const s = Math.sin(n * 127.3) * 43758.5453;
|
|
86
|
+
return s - Math.floor(s);
|
|
87
|
+
};
|
|
88
|
+
const qb = Math.min(Math.floor(f / 4) * 4, 108); // boil 驱动帧,108 后冻结
|
|
89
|
+
const bx = (h(qb + 1) - 0.5) * 7;
|
|
90
|
+
const by = (h(qb + 2) - 0.5) * 7;
|
|
91
|
+
const brot = (h(qb + 3) - 0.5) * 3;
|
|
92
|
+
// 切换瞬间角标弹一下
|
|
93
|
+
const pop = interpolate(f, [SWITCH, SWITCH + 3, SWITCH + 9], [1, 1.35, 1], {
|
|
94
|
+
easing: Easing.out(Easing.cubic),
|
|
95
|
+
extrapolateLeft: 'clamp',
|
|
96
|
+
extrapolateRight: 'clamp',
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const titleOp = interpolate(f, [0, 10], [0, 1], {
|
|
100
|
+
extrapolateLeft: 'clamp',
|
|
101
|
+
extrapolateRight: 'clamp',
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<div style={{ width: 1920, height: 1080, background: G.bg, position: 'relative', overflow: 'hidden' }}>
|
|
106
|
+
<div style={{ position: 'absolute', top: 90, width: '100%', textAlign: 'center', opacity: titleOp }}>
|
|
107
|
+
<TitleBlock text="SAKUGA TIMING SHIFT" size={64} />
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
{/* 轨道基线 + 中央落位虚线槽 */}
|
|
111
|
+
<div
|
|
112
|
+
style={{
|
|
113
|
+
position: 'absolute',
|
|
114
|
+
left: 100,
|
|
115
|
+
right: 100,
|
|
116
|
+
top: CARD_Y + CARD_H + 24,
|
|
117
|
+
height: 3,
|
|
118
|
+
background: G.line,
|
|
119
|
+
borderRadius: 2,
|
|
120
|
+
}}
|
|
121
|
+
/>
|
|
122
|
+
<div
|
|
123
|
+
style={{
|
|
124
|
+
position: 'absolute',
|
|
125
|
+
left: X_CENTER,
|
|
126
|
+
top: CARD_Y,
|
|
127
|
+
width: CARD_W,
|
|
128
|
+
height: CARD_H,
|
|
129
|
+
border: `3px dashed ${G.bar}`,
|
|
130
|
+
borderRadius: 14,
|
|
131
|
+
boxSizing: 'border-box',
|
|
132
|
+
}}
|
|
133
|
+
/>
|
|
134
|
+
|
|
135
|
+
{/* 冲刺残影 */}
|
|
136
|
+
{ghosts.map((g, i) => (
|
|
137
|
+
<div
|
|
138
|
+
key={`ghost-${i}`}
|
|
139
|
+
style={{ position: 'absolute', left: 0, top: CARD_Y, opacity: g.op, transform: `translateX(${g.xg}px)` }}
|
|
140
|
+
>
|
|
141
|
+
<Card w={CARD_W} h={CARD_H} seed={4} />
|
|
142
|
+
</div>
|
|
143
|
+
))}
|
|
144
|
+
|
|
145
|
+
{/* 主卡 */}
|
|
146
|
+
<div
|
|
147
|
+
style={{
|
|
148
|
+
position: 'absolute',
|
|
149
|
+
left: 0,
|
|
150
|
+
top: CARD_Y,
|
|
151
|
+
transform: `translateX(${x}px) rotate(${rot}deg) scaleX(${stretchX * sqX}) scaleY(${stretchY * sqY})`,
|
|
152
|
+
transformOrigin: '50% 50%',
|
|
153
|
+
}}
|
|
154
|
+
>
|
|
155
|
+
<Card w={CARD_W} h={CARD_H} seed={4} />
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
{/* 角标:on 3s / on 1s */}
|
|
159
|
+
<div
|
|
160
|
+
style={{
|
|
161
|
+
position: 'absolute',
|
|
162
|
+
left: 120,
|
|
163
|
+
top: 160,
|
|
164
|
+
transform: `translate(${bx}px, ${by}px) rotate(${brot}deg) scale(${pop})`,
|
|
165
|
+
transformOrigin: '0% 50%',
|
|
166
|
+
fontFamily: 'Courier New, monospace',
|
|
167
|
+
fontWeight: 700,
|
|
168
|
+
fontSize: 84,
|
|
169
|
+
color: G.ink,
|
|
170
|
+
borderBottom: `6px solid ${G.ink}`,
|
|
171
|
+
paddingBottom: 6,
|
|
172
|
+
}}
|
|
173
|
+
>
|
|
174
|
+
{onThrees ? 'on 3s' : 'on 1s'}
|
|
175
|
+
</div>
|
|
176
|
+
</div>
|
|
177
|
+
);
|
|
178
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// scene-locked-title —— 透视锁定标题(《战栗空间》式)
|
|
2
|
+
// dashboard 平面躺在 3D 空间里,巨大标题悬浮其前方(translateZ 分离)。
|
|
3
|
+
// 只动最外层"相机"容器(缓慢平移 + 轻转),标题与 UI 共享灭点、
|
|
4
|
+
// 随透视一起变形,视差让人读出"字钉在场景里"而非贴在玻璃上。
|
|
5
|
+
// f0–12 初始静置,f12–112 相机运动(inOut,非匀速),f112 起真静止 ≥38f。
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import { useCurrentFrame, interpolate, Easing } from 'remotion';
|
|
8
|
+
import { G, FakeDashboard, TitleBlock } from '../_fixtures/Fixtures';
|
|
9
|
+
|
|
10
|
+
const MOVE_START = 12;
|
|
11
|
+
const MOVE_END = 112;
|
|
12
|
+
const camEase = Easing.inOut(Easing.cubic);
|
|
13
|
+
|
|
14
|
+
const cam = (f: number, from: number, to: number): number =>
|
|
15
|
+
interpolate(f, [MOVE_START, MOVE_END], [from, to], {
|
|
16
|
+
easing: camEase,
|
|
17
|
+
extrapolateLeft: 'clamp',
|
|
18
|
+
extrapolateRight: 'clamp',
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export const SceneLockedTitle: React.FC = () => {
|
|
22
|
+
const frame = useCurrentFrame();
|
|
23
|
+
|
|
24
|
+
// 相机:横移 ±280px + rotateY ±8° + 轻微升降。幅度取可感下限以上。
|
|
25
|
+
const camX = cam(frame, 280, -280);
|
|
26
|
+
const camY = cam(frame, -40, 40);
|
|
27
|
+
const camRY = cam(frame, -8, 8);
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<div
|
|
31
|
+
style={{
|
|
32
|
+
width: 1920,
|
|
33
|
+
height: 1080,
|
|
34
|
+
background: G.bg,
|
|
35
|
+
overflow: 'hidden',
|
|
36
|
+
position: 'relative',
|
|
37
|
+
perspective: 1200,
|
|
38
|
+
perspectiveOrigin: '50% 42%',
|
|
39
|
+
}}
|
|
40
|
+
>
|
|
41
|
+
{/* 相机层:唯一被动画的 transform */}
|
|
42
|
+
<div
|
|
43
|
+
style={{
|
|
44
|
+
position: 'absolute',
|
|
45
|
+
left: '50%',
|
|
46
|
+
top: '50%',
|
|
47
|
+
width: 0,
|
|
48
|
+
height: 0,
|
|
49
|
+
transformStyle: 'preserve-3d',
|
|
50
|
+
transform: `translate3d(${camX}px, ${camY}px, 0) rotateY(${camRY}deg)`,
|
|
51
|
+
}}
|
|
52
|
+
>
|
|
53
|
+
{/* 场景层:静态的"躺倒"姿态,dashboard 与标题共享此平面系 */}
|
|
54
|
+
<div
|
|
55
|
+
style={{
|
|
56
|
+
transformStyle: 'preserve-3d',
|
|
57
|
+
transform: 'rotateX(50deg) rotateZ(-16deg)',
|
|
58
|
+
}}
|
|
59
|
+
>
|
|
60
|
+
{/* dashboard 平面(translateZ 0) */}
|
|
61
|
+
<div
|
|
62
|
+
style={{
|
|
63
|
+
position: 'absolute',
|
|
64
|
+
left: -960,
|
|
65
|
+
top: -540,
|
|
66
|
+
transform: 'translateZ(0px) scale(0.92)',
|
|
67
|
+
}}
|
|
68
|
+
>
|
|
69
|
+
<FakeDashboard variant="A" />
|
|
70
|
+
</div>
|
|
71
|
+
{/* 标题悬浮在平面前方 150px,与 UI 同灭点,随透视变形 */}
|
|
72
|
+
<div
|
|
73
|
+
style={{
|
|
74
|
+
position: 'absolute',
|
|
75
|
+
left: -700,
|
|
76
|
+
top: -140,
|
|
77
|
+
transform: 'translateZ(150px)',
|
|
78
|
+
}}
|
|
79
|
+
>
|
|
80
|
+
<TitleBlock text="NORTH STAR" size={200} />
|
|
81
|
+
</div>
|
|
82
|
+
{/* 副标题:更贴近平面(Z 60px),运动中与主标题产生层间视差 */}
|
|
83
|
+
<div
|
|
84
|
+
style={{
|
|
85
|
+
position: 'absolute',
|
|
86
|
+
left: -690,
|
|
87
|
+
top: 90,
|
|
88
|
+
transform: 'translateZ(60px)',
|
|
89
|
+
opacity: 0.75,
|
|
90
|
+
}}
|
|
91
|
+
>
|
|
92
|
+
<TitleBlock text="A FILM BY DASHBOARD" size={44} />
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
);
|
|
98
|
+
};
|