hyper-animator-codex 0.7.1 → 0.8.1
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 -4
- package/bin/hyper-animator-codex.mjs +1 -1
- package/lib/minimax-config.mjs +3 -3
- package/package.json +4 -1
- package/skills/hyper-animator-codex/SKILL.md +66 -22
- package/skills/hyper-animator-codex/agents/openai.yaml +2 -2
- package/skills/hyper-animator-codex/contracts/shot-plan.schema.json +280 -0
- package/skills/hyper-animator-codex/contracts/workflow-policy.json +97 -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 +99 -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 +32 -8
- package/skills/hyper-animator-codex/references/minimax-music-workflow.md +24 -4
- package/skills/hyper-animator-codex/references/narration-audio-workflow.md +47 -10
- 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/motion-pack/README.md +32 -0
- package/skills/hyper-animator-codex/references/shotcraft/motion-pack/shotcraft-motion-pack.js +178 -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/git_checkpoint.mjs +2 -2
- 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 +266 -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,93 @@
|
|
|
1
|
+
// icon-field-colorize —— 灰阶图标原野错峰浮现(错峰淡入+微弹),停一拍后
|
|
2
|
+
// 蓝色整场极快扫翻,随后橙/绿/红三道色波依次向下扫过,终态四色横带。
|
|
3
|
+
// 对标 bear-app.mp4 0–3s(密帧核实:非同帧硬翻,是极快多道波纹翻色)。
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { AbsoluteFill, interpolate, useCurrentFrame } from 'remotion';
|
|
6
|
+
|
|
7
|
+
const mulberry32 = (a: number) => () => {
|
|
8
|
+
let t = (a += 0x6d2b79f5);
|
|
9
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
10
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
11
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// 16 个简笔图标(viewBox 0 0 24 24,纯填充),求可辨认不求精致
|
|
15
|
+
const SHAPES: ((c: string) => React.ReactNode)[] = [
|
|
16
|
+
(c) => <path fill={c} d="M12 21s-7.5-4.7-9.6-9C.9 8.7 2.7 5 6.2 5c2 0 3.3 1 4 2.1h3.6C14.5 6 15.8 5 17.8 5c3.5 0 5.3 3.7 3.8 7-2.1 4.3-9.6 9-9.6 9z" transform="scale(0.92) translate(1,0)" />,
|
|
17
|
+
(c) => <path fill={c} d="M12 2l2.7 6.3 6.8.5-5.2 4.4 1.6 6.6L12 16.2 6.1 19.8l1.6-6.6L2.5 8.8l6.8-.5z" />,
|
|
18
|
+
(c) => <path fill={c} d="M13 2L4 14h6l-1 8 9-12h-6z" />,
|
|
19
|
+
(c) => <circle fill={c} cx="12" cy="12" r="9" />,
|
|
20
|
+
(c) => <path fill={c} d="M9 3v12.3A3.5 3.5 0 1 0 11 18V7h7v6.3A3.5 3.5 0 1 0 20 16V3z" transform="scale(0.85) translate(1.5,1.5)" />,
|
|
21
|
+
(c) => <path fill={c} d="M4 4h16a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9l-5 4V6a2 2 0 0 1 2-2z" transform="scale(0.85) translate(2,2)" />,
|
|
22
|
+
(c) => <><rect fill={c} x="3" y="6" width="18" height="13" rx="2.5" /><circle fill="#fff" cx="12" cy="12.5" r="3.6" /><rect fill={c} x="8" y="3.5" width="8" height="4" rx="1.5" /></>,
|
|
23
|
+
(c) => <path fill={c} d="M6.5 19a4.5 4.5 0 0 1-.4-9A6 6 0 0 1 17.8 8.7 4.2 4.2 0 0 1 17.5 19z" />,
|
|
24
|
+
(c) => <path fill={c} d="M12 2a7 7 0 0 0-7 7c0 5 7 13 7 13s7-8 7-13a7 7 0 0 0-7-7zm0 9.5A2.5 2.5 0 1 1 12 6a2.5 2.5 0 0 1 0 5.5z" transform="scale(0.9) translate(1.2,0.5)" />,
|
|
25
|
+
(c) => <path fill={c} d="M3.5 10L12 3l8.5 7V21h-6v-6h-5v6h-6z" />,
|
|
26
|
+
(c) => <><rect fill={c} x="3" y="8" width="18" height="4" rx="1" /><rect fill={c} x="5" y="12" width="14" height="9" rx="1" /><rect fill="#fff" x="10.9" y="8" width="2.2" height="13" /></>,
|
|
27
|
+
(c) => <path fill={c} d="M9.4 20.6l-1 1.9 7.2-.1 4.9-8.5-2.2.1-2 3.4L13 4.5h-2.1L7.6 17.3z" transform="scale(0.9) translate(1,1)" />,
|
|
28
|
+
(c) => <path fill={c} d="M20.3 6.7L9.6 17.4l-5.9-5.9 2.1-2.1 3.8 3.8 8.6-8.6z" />,
|
|
29
|
+
(c) => <path fill={c} d="M21.5 15.5L14 12V5.5a2 2 0 1 0-4 0V12l-7.5 3.5v2l7.5-2v4l-2.5 2v1.5l4.5-1 4.5 1V21.5l-2.5-2v-4l7.5 2z" transform="scale(0.85) translate(1.8,1.8)" />,
|
|
30
|
+
(c) => <><circle fill={c} cx="12" cy="12" r="4" /><path fill={c} d="M12 1.5l1.4 3.6h-2.8zM12 22.5l-1.4-3.6h2.8zM1.5 12l3.6-1.4v2.8zM22.5 12l-3.6 1.4v-2.8zM4.6 4.6l3.5 1.5-2 2zM19.4 19.4l-3.5-1.5 2-2zM19.4 4.6l-1.5 3.5-2-2zM4.6 19.4l1.5-3.5 2 2z" /></>,
|
|
31
|
+
(c) => <path fill={c} d="M20 4C10 4 4.5 9 4 15.7 3.9 17.5 4 20 4 20s2.7-.2 4.4-.3C15 19.2 20 13.5 20 4zM6.8 17.2C10 11 15 8 15 8s-5.5 1.5-8.8 8z" />,
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
const COLS = 17, ROWS = 10, CELL = 110, ICON = 44;
|
|
35
|
+
const GRAYS = ['#9a9a9a', '#7c7c7c', '#b0b0b0', '#8b8b8b'];
|
|
36
|
+
// 四道色波:蓝覆盖全场,橙/绿/红依次覆盖更低的行带 → 终态四色横带
|
|
37
|
+
const WAVES = [
|
|
38
|
+
{ color: '#5b67e8', fromRow: 0, start: 78 },
|
|
39
|
+
{ color: '#e7a03c', fromRow: 3, start: 90 },
|
|
40
|
+
{ color: '#34a56f', fromRow: 6, start: 100 },
|
|
41
|
+
{ color: '#e2606b', fromRow: 9, start: 110 },
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
export const IconFieldColorize: React.FC = () => {
|
|
45
|
+
const frame = useCurrentFrame();
|
|
46
|
+
const rand = mulberry32(20260718);
|
|
47
|
+
const icons: React.ReactNode[] = [];
|
|
48
|
+
|
|
49
|
+
for (let r = 0; r < ROWS; r++) {
|
|
50
|
+
for (let c = 0; c < COLS; c++) {
|
|
51
|
+
const r1 = rand(), r2 = rand(), r3 = rand();
|
|
52
|
+
// —— 错峰浮现:分 10 批,批内再抖动
|
|
53
|
+
const batch = Math.floor(r1 * 10);
|
|
54
|
+
const t0 = 4 + batch * 4 + r2 * 3;
|
|
55
|
+
const ap = interpolate(frame, [t0, t0 + 8], [0, 1], {
|
|
56
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
57
|
+
});
|
|
58
|
+
if (ap <= 0) continue;
|
|
59
|
+
// 微弹:0.55 → 1.07 → 1
|
|
60
|
+
const easeOut = 1 - Math.pow(1 - ap, 3);
|
|
61
|
+
const appearScale = ap < 1 ? 0.55 + easeOut * 0.52 - Math.max(0, ap - 0.72) * 0.25 : 1;
|
|
62
|
+
|
|
63
|
+
// —— 色波:每道波从起始行向下快扫(行 1.4 帧 + 列微倾 + 抖动)
|
|
64
|
+
const gray = GRAYS[Math.floor(r2 * GRAYS.length)];
|
|
65
|
+
let color = gray;
|
|
66
|
+
let flipPhase = 0; // 最近一次翻色的进行度,用于 pop
|
|
67
|
+
for (const w of WAVES) {
|
|
68
|
+
if (r < w.fromRow) continue;
|
|
69
|
+
const arrive = w.start + (r - w.fromRow) * 1.4 + c * 0.25 + r3 * 1.5;
|
|
70
|
+
const p = interpolate(frame, [arrive, arrive + 3], [0, 1], {
|
|
71
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
72
|
+
});
|
|
73
|
+
if (p > 0) { color = w.color; flipPhase = p; }
|
|
74
|
+
}
|
|
75
|
+
const flipPop = flipPhase > 0 && flipPhase < 1
|
|
76
|
+
? 1 + Math.sin(flipPhase * Math.PI) * 0.22 : 1;
|
|
77
|
+
|
|
78
|
+
const shape = SHAPES[Math.floor(r3 * SHAPES.length) % SHAPES.length];
|
|
79
|
+
const x = 48 + c * CELL + (r % 2) * 26;
|
|
80
|
+
const y = 26 + r * CELL;
|
|
81
|
+
icons.push(
|
|
82
|
+
<div key={`${r}-${c}`} style={{
|
|
83
|
+
position: 'absolute', left: x, top: y, width: ICON, height: ICON,
|
|
84
|
+
opacity: ap, transform: `scale(${appearScale * flipPop})`,
|
|
85
|
+
}}>
|
|
86
|
+
<svg viewBox="0 0 24 24" width={ICON} height={ICON}>{shape(color)}</svg>
|
|
87
|
+
</div>,
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return <AbsoluteFill style={{ background: '#ffffff' }}>{icons}</AbsoluteFill>;
|
|
93
|
+
};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// 求关注弹跳(attention-bounce)——macOS Dock 语汇:icon 原地起跳讨拍
|
|
2
|
+
// 半屏 app 图标(圆角方块+铃形符号)在地面线上连跳 4 次且一次比一次高
|
|
3
|
+
// (首跳 0.5 倍 icon 高 → 末跳 1.2 倍);每次落地帧压扁(宽 1.2x 高 0.8x)
|
|
4
|
+
// + 落点尘点 2–3 颗;最高那跳镜头整体向 icon 轻推 8%("被吸引");
|
|
5
|
+
// 落定后 icon 右侧弹开一张功能面板卡收尾。
|
|
6
|
+
// 节拍:0–12 静置 → 12 起跳(4 跳递增,各 16/18/20/24f)→ ~90 落定 →
|
|
7
|
+
// 92–104 面板卡弹出 → 110 后真静止 40f。帧确定,尘点用 sin 散列。
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import { useCurrentFrame, interpolate, Easing } from 'remotion';
|
|
10
|
+
import { G, Card } from '../_fixtures/Fixtures';
|
|
11
|
+
|
|
12
|
+
const AMBER = '#b45309';
|
|
13
|
+
const ICON = 400; // icon 边长(半屏级)
|
|
14
|
+
const GROUND = 940; // 地面线 y(末跳 1.2x 顶点 + 8% 推近后仍贴画面上沿不出框)
|
|
15
|
+
const CX = 760; // icon 中心 x(右侧留面板位)
|
|
16
|
+
|
|
17
|
+
// 4 跳:起跳帧、时长、峰高(相对 icon 高)
|
|
18
|
+
const JUMPS = [
|
|
19
|
+
{ start: 12, dur: 16, peak: 0.5 * ICON },
|
|
20
|
+
{ start: 30, dur: 18, peak: 0.75 * ICON },
|
|
21
|
+
{ start: 50, dur: 20, peak: 0.95 * ICON },
|
|
22
|
+
{ start: 72, dur: 24, peak: 1.2 * ICON },
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
export const AttentionBounce: React.FC = () => {
|
|
26
|
+
const f = useCurrentFrame();
|
|
27
|
+
|
|
28
|
+
// 弹跳高度 + 落地挤压
|
|
29
|
+
let y = 0; // 离地高度
|
|
30
|
+
let squash = 0; // 0–1 落地压扁强度
|
|
31
|
+
let stretch = 0; // 空中拉伸强度(速度感)
|
|
32
|
+
JUMPS.forEach((j) => {
|
|
33
|
+
const t = (f - j.start) / j.dur;
|
|
34
|
+
if (t > 0 && t < 1) {
|
|
35
|
+
y = j.peak * 4 * t * (1 - t); // 抛物线
|
|
36
|
+
stretch = Math.abs(1 - 2 * t) * 0.14; // 起跳/下落速度快时拉长
|
|
37
|
+
}
|
|
38
|
+
// 落地帧后 5f 内压扁回弹
|
|
39
|
+
const land = j.start + j.dur;
|
|
40
|
+
if (f >= land && f < land + 6) {
|
|
41
|
+
squash = Math.max(squash, 1 - (f - land) / 6);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
// 起跳前的预压(第一跳前 3f 蹲一下)
|
|
45
|
+
if (f >= 9 && f < 12) squash = Math.max(squash, (f - 9) / 3 * 0.7);
|
|
46
|
+
|
|
47
|
+
const sx = 1 + squash * 0.2 - stretch * 0.5;
|
|
48
|
+
const sy = 1 - squash * 0.2 + stretch;
|
|
49
|
+
|
|
50
|
+
// 镜头推近:第 4 跳(最高)期间整体 scale 1→1.08,落定后保持
|
|
51
|
+
const zoomT = interpolate(f, [72, 88], [0, 1], {
|
|
52
|
+
extrapolateLeft: 'clamp',
|
|
53
|
+
extrapolateRight: 'clamp',
|
|
54
|
+
easing: Easing.inOut(Easing.quad),
|
|
55
|
+
});
|
|
56
|
+
const zoom = 1 + 0.08 * zoomT;
|
|
57
|
+
|
|
58
|
+
// 尘点:每次落地帧生成 3 颗,向两侧飞散淡出(12f 生命)
|
|
59
|
+
const dusts: Array<{ x: number; y: number; r: number; op: number }> = [];
|
|
60
|
+
JUMPS.forEach((j, ji) => {
|
|
61
|
+
const land = j.start + j.dur;
|
|
62
|
+
const life = (f - land) / 12;
|
|
63
|
+
if (life <= 0 || life >= 1) return;
|
|
64
|
+
for (let k = 0; k < 3; k++) {
|
|
65
|
+
const seed = ji * 3 + k;
|
|
66
|
+
const dir = k === 1 ? 0 : k === 0 ? -1 : 1;
|
|
67
|
+
const spread = (60 + 40 * Math.abs(Math.sin(seed * 5.7))) * (ji + 2) * 0.45;
|
|
68
|
+
const e = Easing.out(Easing.cubic)(life);
|
|
69
|
+
dusts.push({
|
|
70
|
+
x: CX + dir * (ICON * 0.42 + spread * e) + (dir === 0 ? 30 * Math.sin(seed * 3.1) * e : 0),
|
|
71
|
+
y: GROUND - 14 - 46 * e * (0.6 + 0.5 * Math.abs(Math.sin(seed * 2.3))),
|
|
72
|
+
r: 12 + 6 * Math.abs(Math.sin(seed * 4.9)) - 8 * life,
|
|
73
|
+
op: (1 - life) * 0.8,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// 功能面板卡:落定后(f=98)从 icon 右侧弹出
|
|
79
|
+
const panelT = interpolate(f, [98, 110], [0, 1], {
|
|
80
|
+
extrapolateLeft: 'clamp',
|
|
81
|
+
extrapolateRight: 'clamp',
|
|
82
|
+
easing: Easing.out(Easing.back(1.8)),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const iconTop = GROUND - ICON - y;
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<div style={{ width: 1920, height: 1080, background: G.bg, position: 'relative', overflow: 'hidden' }}>
|
|
89
|
+
{/* 镜头层:整体向 icon 轻推 */}
|
|
90
|
+
<div
|
|
91
|
+
style={{
|
|
92
|
+
width: 1920,
|
|
93
|
+
height: 1080,
|
|
94
|
+
transform: `scale(${zoom})`,
|
|
95
|
+
transformOrigin: `${CX}px ${GROUND - ICON / 2}px`,
|
|
96
|
+
position: 'relative',
|
|
97
|
+
}}
|
|
98
|
+
>
|
|
99
|
+
{/* 地面线 */}
|
|
100
|
+
<div style={{ position: 'absolute', left: 120, top: GROUND, width: 1680, height: 8, background: G.bar, borderRadius: 4 }} />
|
|
101
|
+
|
|
102
|
+
{/* 落地尘点 */}
|
|
103
|
+
{dusts.map((d, i) => (
|
|
104
|
+
<div
|
|
105
|
+
key={i}
|
|
106
|
+
style={{
|
|
107
|
+
position: 'absolute',
|
|
108
|
+
left: d.x - d.r,
|
|
109
|
+
top: d.y - d.r,
|
|
110
|
+
width: d.r * 2,
|
|
111
|
+
height: d.r * 2,
|
|
112
|
+
borderRadius: d.r,
|
|
113
|
+
background: G.mid,
|
|
114
|
+
opacity: d.op,
|
|
115
|
+
}}
|
|
116
|
+
/>
|
|
117
|
+
))}
|
|
118
|
+
|
|
119
|
+
{/* 影子:随高度缩小变淡 */}
|
|
120
|
+
<div
|
|
121
|
+
style={{
|
|
122
|
+
position: 'absolute',
|
|
123
|
+
left: CX - ICON * 0.42 * (1 - y / (ICON * 2.4)),
|
|
124
|
+
top: GROUND + 16,
|
|
125
|
+
width: ICON * 0.84 * (1 - y / (ICON * 2.4)),
|
|
126
|
+
height: 30,
|
|
127
|
+
borderRadius: '50%',
|
|
128
|
+
background: 'rgba(0,0,0,0.18)',
|
|
129
|
+
filter: 'blur(6px)',
|
|
130
|
+
opacity: 1 - (y / (ICON * 1.6)) * 0.5,
|
|
131
|
+
}}
|
|
132
|
+
/>
|
|
133
|
+
|
|
134
|
+
{/* app icon:圆角方块 + 铃形符号(自绘 SVG,半屏特写) */}
|
|
135
|
+
<svg
|
|
136
|
+
width={ICON}
|
|
137
|
+
height={ICON}
|
|
138
|
+
viewBox="0 0 420 420"
|
|
139
|
+
style={{
|
|
140
|
+
position: 'absolute',
|
|
141
|
+
left: CX - ICON / 2,
|
|
142
|
+
top: iconTop,
|
|
143
|
+
transform: `scale(${sx}, ${sy})`,
|
|
144
|
+
transformOrigin: '50% 100%',
|
|
145
|
+
}}
|
|
146
|
+
>
|
|
147
|
+
<rect x={14} y={14} width={392} height={392} rx={88} fill={G.card} stroke={G.ink} strokeWidth={18} />
|
|
148
|
+
{/* 符号:简洁铃形 */}
|
|
149
|
+
<path
|
|
150
|
+
d="M 210 110 C 160 110 140 155 138 200 C 136 245 118 272 100 290 L 320 290 C 302 272 284 245 282 200 C 280 155 260 110 210 110 Z"
|
|
151
|
+
fill="none"
|
|
152
|
+
stroke={G.ink}
|
|
153
|
+
strokeWidth={22}
|
|
154
|
+
strokeLinejoin="round"
|
|
155
|
+
/>
|
|
156
|
+
<circle cx={210} cy={322} r={22} fill={AMBER} />
|
|
157
|
+
</svg>
|
|
158
|
+
|
|
159
|
+
{/* 功能面板卡:落定后弹出 */}
|
|
160
|
+
{panelT > 0 && (
|
|
161
|
+
<div
|
|
162
|
+
style={{
|
|
163
|
+
position: 'absolute',
|
|
164
|
+
left: CX + ICON / 2 + 60,
|
|
165
|
+
top: GROUND - ICON - 40,
|
|
166
|
+
transform: `scale(${panelT})`,
|
|
167
|
+
transformOrigin: 'left bottom',
|
|
168
|
+
opacity: Math.min(1, panelT * 1.5),
|
|
169
|
+
}}
|
|
170
|
+
>
|
|
171
|
+
<Card w={520} h={330} seed={4} />
|
|
172
|
+
<div
|
|
173
|
+
style={{
|
|
174
|
+
position: 'absolute',
|
|
175
|
+
top: -28,
|
|
176
|
+
left: 24,
|
|
177
|
+
padding: '10px 24px',
|
|
178
|
+
borderRadius: 24,
|
|
179
|
+
background: AMBER,
|
|
180
|
+
color: '#fff',
|
|
181
|
+
fontFamily: 'Helvetica, Arial, sans-serif',
|
|
182
|
+
fontWeight: 800,
|
|
183
|
+
fontSize: 26,
|
|
184
|
+
}}
|
|
185
|
+
>
|
|
186
|
+
New
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
)}
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
);
|
|
193
|
+
};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// 爆花确认(pop-burst-confirm)——确认时刻的三连爆
|
|
2
|
+
// 半屏大对勾 icon(圆底+勾):先缩 0.6x 蓄力 3f → 弹 1.35x 过冲 → 落回 1x,
|
|
3
|
+
// 释放帧同帧中心射出 10 根短线粒子(径向飞出后消失)+ 一圈描边圆环从
|
|
4
|
+
// icon 边缘扩到 2.5 倍直径淡出;随后 "Deployed" 小标签弹出。
|
|
5
|
+
// 节拍:0–20 静置(空心圆待确认)→ 20–23 缩 0.6x → 23–27 蓄力 3f →
|
|
6
|
+
// 27 释放(勾画出+粒子+圆环)→ 27–44 过冲落回 → 40–50 标签弹出 → 55 后真静止 65f。
|
|
7
|
+
// 帧确定,无随机源(粒子角度抖动用 sin 散列)。
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import { useCurrentFrame, interpolate, Easing } from 'remotion';
|
|
10
|
+
import { G } from '../_fixtures/Fixtures';
|
|
11
|
+
|
|
12
|
+
const AMBER = '#b45309';
|
|
13
|
+
const POP = 27; // 释放帧
|
|
14
|
+
const DUR = 120;
|
|
15
|
+
|
|
16
|
+
export const PopBurstConfirm: React.FC = () => {
|
|
17
|
+
const f = useCurrentFrame();
|
|
18
|
+
|
|
19
|
+
// icon 缩放:蓄力→过冲→落回
|
|
20
|
+
const scale = (() => {
|
|
21
|
+
if (f <= 20) return 1;
|
|
22
|
+
if (f <= 23)
|
|
23
|
+
return interpolate(f, [20, 23], [1, 0.6], { easing: Easing.in(Easing.quad) });
|
|
24
|
+
if (f <= POP) return 0.6;
|
|
25
|
+
if (f <= 33)
|
|
26
|
+
return interpolate(f, [POP, 33], [0.6, 1.35], { easing: Easing.out(Easing.cubic) });
|
|
27
|
+
return interpolate(f, [33, 44], [1.35, 1], {
|
|
28
|
+
extrapolateRight: 'clamp',
|
|
29
|
+
easing: Easing.out(Easing.back(2)),
|
|
30
|
+
});
|
|
31
|
+
})();
|
|
32
|
+
|
|
33
|
+
// 对勾:释放帧起 8f 内画出(dashoffset 滑窗)
|
|
34
|
+
const checkT = interpolate(f, [POP, POP + 8], [0, 1], {
|
|
35
|
+
extrapolateLeft: 'clamp',
|
|
36
|
+
extrapolateRight: 'clamp',
|
|
37
|
+
easing: Easing.out(Easing.cubic),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// 粒子:释放帧起 14f 径向飞出(幅度加码到 190px 保半屏可感)
|
|
41
|
+
const pt = interpolate(f, [POP, POP + 14], [0, 1], {
|
|
42
|
+
extrapolateLeft: 'clamp',
|
|
43
|
+
extrapolateRight: 'clamp',
|
|
44
|
+
});
|
|
45
|
+
const pDist = 210 + 190 * Easing.out(Easing.cubic)(pt);
|
|
46
|
+
const pLen = 46 * (1 - pt);
|
|
47
|
+
|
|
48
|
+
// 圆环:释放帧起 20f 从 icon 边缘扩到 2.5 倍直径淡出
|
|
49
|
+
const rt = interpolate(f, [POP, POP + 20], [0, 1], {
|
|
50
|
+
extrapolateLeft: 'clamp',
|
|
51
|
+
extrapolateRight: 'clamp',
|
|
52
|
+
});
|
|
53
|
+
const ringR = 200 + 300 * Easing.out(Easing.cubic)(rt);
|
|
54
|
+
const ringO = 0.85 * (1 - rt);
|
|
55
|
+
const ringW = 16 - 12 * rt;
|
|
56
|
+
|
|
57
|
+
// 标签:40f 弹出(back 超调)
|
|
58
|
+
const tagT = interpolate(f, [40, 50], [0, 1], {
|
|
59
|
+
extrapolateLeft: 'clamp',
|
|
60
|
+
extrapolateRight: 'clamp',
|
|
61
|
+
easing: Easing.out(Easing.back(2.6)),
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const CX = 960;
|
|
65
|
+
const CY = 470;
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<div style={{ width: 1920, height: 1080, background: G.bg, position: 'relative', overflow: 'hidden' }}>
|
|
69
|
+
{/* 扩散圆环(不随 icon 缩放) */}
|
|
70
|
+
{rt > 0 && rt < 1 && (
|
|
71
|
+
<svg
|
|
72
|
+
width={1400}
|
|
73
|
+
height={1400}
|
|
74
|
+
style={{ position: 'absolute', left: CX - 700, top: CY - 700 }}
|
|
75
|
+
>
|
|
76
|
+
<circle cx={700} cy={700} r={ringR} fill="none" stroke={AMBER} strokeWidth={ringW} opacity={ringO} />
|
|
77
|
+
</svg>
|
|
78
|
+
)}
|
|
79
|
+
|
|
80
|
+
{/* 粒子:10 根短线径向飞出,角度带 sin 散列微抖 */}
|
|
81
|
+
{pt > 0 && pt < 1 && (
|
|
82
|
+
<svg
|
|
83
|
+
width={1400}
|
|
84
|
+
height={1400}
|
|
85
|
+
style={{ position: 'absolute', left: CX - 700, top: CY - 700 }}
|
|
86
|
+
>
|
|
87
|
+
{Array.from({ length: 10 }).map((_, i) => {
|
|
88
|
+
const ang = ((i * 36 + 9 * Math.sin(i * 7.31)) * Math.PI) / 180;
|
|
89
|
+
const x1 = 700 + Math.cos(ang) * pDist;
|
|
90
|
+
const y1 = 700 + Math.sin(ang) * pDist;
|
|
91
|
+
const x2 = 700 + Math.cos(ang) * (pDist + pLen);
|
|
92
|
+
const y2 = 700 + Math.sin(ang) * (pDist + pLen);
|
|
93
|
+
return (
|
|
94
|
+
<line
|
|
95
|
+
key={i}
|
|
96
|
+
x1={x1} y1={y1} x2={x2} y2={y2}
|
|
97
|
+
stroke={i % 5 < 2 ? AMBER : G.ink}
|
|
98
|
+
strokeWidth={12}
|
|
99
|
+
strokeLinecap="round"
|
|
100
|
+
opacity={1 - pt}
|
|
101
|
+
/>
|
|
102
|
+
);
|
|
103
|
+
})}
|
|
104
|
+
</svg>
|
|
105
|
+
)}
|
|
106
|
+
|
|
107
|
+
{/* 主体 icon:圆底 + 对勾(半屏特写 ~480px) */}
|
|
108
|
+
<svg
|
|
109
|
+
width={480}
|
|
110
|
+
height={480}
|
|
111
|
+
viewBox="0 0 480 480"
|
|
112
|
+
style={{
|
|
113
|
+
position: 'absolute',
|
|
114
|
+
left: CX - 240,
|
|
115
|
+
top: CY - 240,
|
|
116
|
+
transform: `scale(${scale})`,
|
|
117
|
+
transformOrigin: '50% 50%',
|
|
118
|
+
}}
|
|
119
|
+
>
|
|
120
|
+
<circle cx={240} cy={240} r={190} fill={G.card} stroke={G.ink} strokeWidth={22} />
|
|
121
|
+
{checkT > 0 && (
|
|
122
|
+
<path
|
|
123
|
+
d="M 150 245 L 215 310 L 340 175"
|
|
124
|
+
fill="none"
|
|
125
|
+
stroke={AMBER}
|
|
126
|
+
strokeWidth={34}
|
|
127
|
+
strokeLinecap="round"
|
|
128
|
+
strokeLinejoin="round"
|
|
129
|
+
pathLength={1}
|
|
130
|
+
strokeDasharray={1}
|
|
131
|
+
strokeDashoffset={1 - checkT}
|
|
132
|
+
/>
|
|
133
|
+
)}
|
|
134
|
+
</svg>
|
|
135
|
+
|
|
136
|
+
{/* Deployed 小标签 */}
|
|
137
|
+
{tagT > 0 && (
|
|
138
|
+
<div
|
|
139
|
+
style={{
|
|
140
|
+
position: 'absolute',
|
|
141
|
+
left: CX - 130,
|
|
142
|
+
top: CY + 300,
|
|
143
|
+
width: 260,
|
|
144
|
+
transform: `scale(${tagT})`,
|
|
145
|
+
transformOrigin: '50% 0%',
|
|
146
|
+
padding: '16px 0',
|
|
147
|
+
borderRadius: 40,
|
|
148
|
+
background: G.ink,
|
|
149
|
+
color: '#ffffff',
|
|
150
|
+
textAlign: 'center',
|
|
151
|
+
fontFamily: 'Helvetica, Arial, sans-serif',
|
|
152
|
+
fontWeight: 800,
|
|
153
|
+
fontSize: 40,
|
|
154
|
+
letterSpacing: 1,
|
|
155
|
+
}}
|
|
156
|
+
>
|
|
157
|
+
Deployed
|
|
158
|
+
</div>
|
|
159
|
+
)}
|
|
160
|
+
</div>
|
|
161
|
+
);
|
|
162
|
+
};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AbsoluteFill, Easing, interpolate, useCurrentFrame } from 'remotion';
|
|
3
|
+
import { FakeDashboard, Card, TitleBlock, G } from '../_fixtures/Fixtures';
|
|
4
|
+
|
|
5
|
+
// anime-impact 动漫打击帧〔组合〕:crash-zoom 急推撞停在目标卡上的那 3 帧,
|
|
6
|
+
// 整幅画面反转成黑白负片 + 手绘放射集中线 + 红青通道 ±8px 色散——
|
|
7
|
+
// 像素被打了一拳,第 4 帧一切撤掉恢复干净特写 + 6px 震屏衰减。
|
|
8
|
+
// 节拍:0–24 建立全景 hold → 24–30 急推(6f ease-in 到 2.4x) →
|
|
9
|
+
// 30–32 冲击帧(3f 负片/集中线/RGB split,每帧换形态) →
|
|
10
|
+
// 33 起恢复特写 + 震屏衰减 → ~45–120 静止读卡。
|
|
11
|
+
|
|
12
|
+
const ZOOM_START = 24;
|
|
13
|
+
const ZOOM_END = 30; // 撞停帧
|
|
14
|
+
const IMPACT_LEN = 3; // 冲击帧持续 3f(30/31/32)
|
|
15
|
+
const RECOVER = ZOOM_END + IMPACT_LEN; // 33:恢复干净特写
|
|
16
|
+
|
|
17
|
+
// 目标卡:盖在 3x2 网格中排第 2 格上(列 2 行 1)
|
|
18
|
+
const CARD = { x: 808, y: 108, w: 524, h: 454 };
|
|
19
|
+
const CX = CARD.x + CARD.w / 2; // 1070
|
|
20
|
+
const CY = CARD.y + CARD.h / 2; // 335
|
|
21
|
+
const SCALE_END = 2.4;
|
|
22
|
+
|
|
23
|
+
// seed 正弦哈希(禁 Math.random)
|
|
24
|
+
const rnd = (i: number) => {
|
|
25
|
+
const s = Math.sin(i * 127.3) * 43758.5453;
|
|
26
|
+
return s - Math.floor(s);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// 手绘放射集中线:30 根从卡片周缘指向画框外的尖楔形,phase 换一次形态
|
|
30
|
+
const SpeedLines: React.FC<{ phase: number }> = ({ phase }) => {
|
|
31
|
+
const cx = 960;
|
|
32
|
+
const cy = 540;
|
|
33
|
+
const R_OUT = 1300; // 超出画框对角(~1101)
|
|
34
|
+
const polys = Array.from({ length: 30 }).map((_, i) => {
|
|
35
|
+
const k = i * 13 + phase * 101;
|
|
36
|
+
const ang = ((i + 0.5) / 30) * Math.PI * 2 + (rnd(k) - 0.5) * 0.22;
|
|
37
|
+
const r0 = 300 + rnd(k + 1) * 220; // 内端长短随机(卡片周缘一带)
|
|
38
|
+
const halfW = (7 + rnd(k + 2) * 16) / R_OUT; // 外端宽 7–23px 的楔形
|
|
39
|
+
const ax = cx + Math.cos(ang) * r0;
|
|
40
|
+
const ay = cy + Math.sin(ang) * r0;
|
|
41
|
+
const b1x = cx + Math.cos(ang - halfW) * R_OUT;
|
|
42
|
+
const b1y = cy + Math.sin(ang - halfW) * R_OUT;
|
|
43
|
+
const b2x = cx + Math.cos(ang + halfW) * R_OUT;
|
|
44
|
+
const b2y = cy + Math.sin(ang + halfW) * R_OUT;
|
|
45
|
+
return `${ax},${ay} ${b1x},${b1y} ${b2x},${b2y}`;
|
|
46
|
+
});
|
|
47
|
+
return (
|
|
48
|
+
<svg
|
|
49
|
+
viewBox="0 0 1920 1080"
|
|
50
|
+
style={{ position: 'absolute', inset: 0, width: '100%', height: '100%' }}
|
|
51
|
+
>
|
|
52
|
+
{polys.map((pts, i) => (
|
|
53
|
+
<polygon key={i} points={pts} fill={i % 4 === 0 ? '#111111' : '#f5f5f5'} />
|
|
54
|
+
))}
|
|
55
|
+
</svg>
|
|
56
|
+
);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// 目标卡叠层 + 全景底
|
|
60
|
+
const Scene: React.FC = () => (
|
|
61
|
+
<>
|
|
62
|
+
<FakeDashboard variant="A" />
|
|
63
|
+
<div style={{ position: 'absolute', left: CARD.x, top: CARD.y }}>
|
|
64
|
+
<Card
|
|
65
|
+
w={CARD.w}
|
|
66
|
+
h={CARD.h}
|
|
67
|
+
seed={9}
|
|
68
|
+
style={{ boxShadow: '0 10px 36px rgba(0,0,0,0.18)', border: `3px solid ${G.ink}` }}
|
|
69
|
+
/>
|
|
70
|
+
<div style={{ position: 'absolute', left: 24, bottom: 96 }}>
|
|
71
|
+
<TitleBlock text="IMPACT" size={92} />
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
</>
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
export const AnimeImpact: React.FC = () => {
|
|
78
|
+
const frame = useCurrentFrame();
|
|
79
|
+
|
|
80
|
+
// 急推:6f ease-in 撞到 2.4x,卡心推到画面正中
|
|
81
|
+
const p = interpolate(frame, [ZOOM_START, ZOOM_END], [0, 1], {
|
|
82
|
+
extrapolateLeft: 'clamp',
|
|
83
|
+
extrapolateRight: 'clamp',
|
|
84
|
+
easing: Easing.in(Easing.cubic),
|
|
85
|
+
});
|
|
86
|
+
const scale = 1 + p * (SCALE_END - 1);
|
|
87
|
+
const tx = (960 - CX) * p;
|
|
88
|
+
const ty = (540 - CY) * p;
|
|
89
|
+
|
|
90
|
+
const impact = frame >= ZOOM_END && frame < RECOVER;
|
|
91
|
+
const phase = impact ? frame - ZOOM_END : 0; // 每 1f 换一次集中线形态
|
|
92
|
+
|
|
93
|
+
// 撞停后震屏:6px 起步、指数衰减,~12f 收干后真静止
|
|
94
|
+
const since = frame - RECOVER;
|
|
95
|
+
const env = since >= 0 ? 6 * Math.exp(-since / 2.2) : 0;
|
|
96
|
+
const shakeX = env * Math.sin(since * 3.7);
|
|
97
|
+
const shakeY = env * 0.7 * Math.sin(since * 5.1 + 0.9);
|
|
98
|
+
|
|
99
|
+
const zoomStyle: React.CSSProperties = {
|
|
100
|
+
position: 'absolute',
|
|
101
|
+
inset: 0,
|
|
102
|
+
transform: `translate(${tx}px, ${ty}px) scale(${scale})`,
|
|
103
|
+
transformOrigin: `${CX}px ${CY}px`,
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
<AbsoluteFill style={{ background: impact ? '#131315' : G.bg, overflow: 'hidden' }}>
|
|
108
|
+
<div style={{ position: 'absolute', inset: 0, transform: `translate(${shakeX}px, ${shakeY}px)` }}>
|
|
109
|
+
{/* 主层:冲击帧期间整幅负片黑白 */}
|
|
110
|
+
<div style={{ ...zoomStyle, filter: impact ? 'invert(1) grayscale(1)' : 'none' }}>
|
|
111
|
+
<Scene />
|
|
112
|
+
</div>
|
|
113
|
+
{/* RGB split:红/青双层负片副本,screen 叠底、±8px 错位(随 phase 抖动) */}
|
|
114
|
+
{impact && (
|
|
115
|
+
<>
|
|
116
|
+
<div
|
|
117
|
+
style={{
|
|
118
|
+
position: 'absolute',
|
|
119
|
+
inset: 0,
|
|
120
|
+
mixBlendMode: 'screen',
|
|
121
|
+
transform: `translate(-8px, ${phase % 2 === 0 ? 4 : -4}px)`,
|
|
122
|
+
}}
|
|
123
|
+
>
|
|
124
|
+
<div style={{ ...zoomStyle, filter: 'invert(1) grayscale(1)' }}>
|
|
125
|
+
<Scene />
|
|
126
|
+
</div>
|
|
127
|
+
<div style={{ position: 'absolute', inset: 0, background: '#ff0033', mixBlendMode: 'multiply' }} />
|
|
128
|
+
</div>
|
|
129
|
+
<div
|
|
130
|
+
style={{
|
|
131
|
+
position: 'absolute',
|
|
132
|
+
inset: 0,
|
|
133
|
+
mixBlendMode: 'screen',
|
|
134
|
+
transform: `translate(8px, ${phase % 2 === 0 ? -4 : 4}px)`,
|
|
135
|
+
}}
|
|
136
|
+
>
|
|
137
|
+
<div style={{ ...zoomStyle, filter: 'invert(1) grayscale(1)' }}>
|
|
138
|
+
<Scene />
|
|
139
|
+
</div>
|
|
140
|
+
<div style={{ position: 'absolute', inset: 0, background: '#00e5ff', mixBlendMode: 'multiply' }} />
|
|
141
|
+
</div>
|
|
142
|
+
{/* 手绘放射集中线:每帧换形态 */}
|
|
143
|
+
<SpeedLines phase={phase} />
|
|
144
|
+
</>
|
|
145
|
+
)}
|
|
146
|
+
</div>
|
|
147
|
+
</AbsoluteFill>
|
|
148
|
+
);
|
|
149
|
+
};
|