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,447 @@
|
|
|
1
|
+
import { Img, interpolate, staticFile, useCurrentFrame, Easing } from 'remotion';
|
|
2
|
+
import { PageCam, CamKey } from './PageCam';
|
|
3
|
+
import layout from '../live-layout.json';
|
|
4
|
+
|
|
5
|
+
const cards = layout.projects.cards;
|
|
6
|
+
const PAGE_H = layout.projects.pageH;
|
|
7
|
+
|
|
8
|
+
const HOVER_H = 40; // px above the slot (translateZ) a card hovers at mid-dive
|
|
9
|
+
const SETTLE_EASE = Easing.bezier(0.3, 0, 0.25, 1.15); // slight overshoot / compress
|
|
10
|
+
const DIVE_EASE = Easing.bezier(0.3, 0, 0.2, 1); // decelerate into the hover
|
|
11
|
+
const SLIDE_EASE = Easing.bezier(0.35, 0, 0.2, 1); // nano-lab card slide to the top slot
|
|
12
|
+
|
|
13
|
+
// page paper colors, sampled from the rendered projects-empty texture
|
|
14
|
+
const PAPER = '#f9f6f1'; // page background (bottom rows)
|
|
15
|
+
const FIELD = '#fefcf9'; // search-box interior
|
|
16
|
+
|
|
17
|
+
// ---- 16 "overflow" extras extend the grid DOWNWARD (no hovering, no overlap):
|
|
18
|
+
// fill the empty 3rd column of the y=1402 row, then five new rows below the
|
|
19
|
+
// texture at y=1795…3367, columns matching the real grid. ----
|
|
20
|
+
const COLS = [408, 781.328125, 1154.65625];
|
|
21
|
+
const CARD_W = 357.328125;
|
|
22
|
+
const EXTRA_ROWS = [1795, 2188, 2581, 2974, 3367];
|
|
23
|
+
const PAPER_EXT = { x: 0, y: PAGE_H, w: 1920, h: 2036 }; // paper extension below the texture (flush bottom 3782)
|
|
24
|
+
|
|
25
|
+
const extras = Array.from({ length: 16 }, (_, i) => ({
|
|
26
|
+
file: `card${((i * 3 + 2) % 10) + 1}.png`, // deterministic, neighbors differ
|
|
27
|
+
x: i === 0 ? COLS[2] : COLS[(i - 1) % 3],
|
|
28
|
+
y: i === 0 ? 1402 : EXTRA_ROWS[Math.floor((i - 1) / 3)],
|
|
29
|
+
w: CARD_W,
|
|
30
|
+
h: 312,
|
|
31
|
+
title: '',
|
|
32
|
+
}));
|
|
33
|
+
|
|
34
|
+
// ---- the DECK: all 26 cards start stacked in one pile at the page's top
|
|
35
|
+
// right. The shot opens on a rotating 3D close-up of the pile (0–35), pulls
|
|
36
|
+
// back to reveal the page (35–62), and the cards deal themselves to their
|
|
37
|
+
// slots in reading order (y, then x) on a hard-accelerating cadence — the gap
|
|
38
|
+
// between departures shrinks from 4f to 0.2f (gap_k = 4 − 0.1584k), so the
|
|
39
|
+
// dealing goes from deliberate to a blur. First departs at 36 (mid pull-back),
|
|
40
|
+
// last ≈88, lands ≈96. Pile poses carry a small deterministic jitter and each
|
|
41
|
+
// card keeps a stack height (top of pile = first to leave). ----
|
|
42
|
+
const PILE = { x: 1430, y: 240 };
|
|
43
|
+
const N_CARDS = 26;
|
|
44
|
+
const DEAL_START = 36;
|
|
45
|
+
const STACK_STEP = 3; // px of physical height per card — the pile reads as a real stack
|
|
46
|
+
|
|
47
|
+
// dark-metal backdrop for the opening close-up: covers everything in the page
|
|
48
|
+
// plane, with a warm spotlight pooled on the pile; fades out with the pull-back
|
|
49
|
+
const METAL_FADE = [34, 56] as const;
|
|
50
|
+
|
|
51
|
+
const grid = [
|
|
52
|
+
...cards.map((c) => ({ file: c.file, x: c.x, y: c.y, w: c.w, h: c.h, title: c.title })),
|
|
53
|
+
...extras,
|
|
54
|
+
]
|
|
55
|
+
.sort((a, b) => a.y - b.y || a.x - b.x)
|
|
56
|
+
.map((c, k) => ({
|
|
57
|
+
...c,
|
|
58
|
+
cue: DEAL_START + 4 * k - 0.0792 * k * (k - 1),
|
|
59
|
+
// pile pose: tiny alternating offsets + roll, stacked top-down by k
|
|
60
|
+
px: PILE.x + (((k * 7) % 9) - 4) * 2,
|
|
61
|
+
py: PILE.y + (((k * 5) % 7) - 3) * 2,
|
|
62
|
+
protZ: ((k * 11) % 7) - 3,
|
|
63
|
+
pz: (N_CARDS - k) * STACK_STEP, // physical stack height; k=0 rides on top
|
|
64
|
+
}));
|
|
65
|
+
|
|
66
|
+
// ---- the search target: nano-lab slides up to the first-row slot on filter ----
|
|
67
|
+
const nanoIdx = grid.findIndex((c) => c.title.includes('nano-lab'));
|
|
68
|
+
const nano = grid[nanoIdx];
|
|
69
|
+
const NANO_TO = { x: 408, y: 247 }; // first-row slot the filtered card slides into
|
|
70
|
+
const CLICK_C = { x: 586, y: 391 }; // click point on the settled result card
|
|
71
|
+
|
|
72
|
+
// filter departure rank for the 19 non-target cards (reading order)
|
|
73
|
+
const leaveRank = new Map<number, number>();
|
|
74
|
+
grid.forEach((_, i) => {
|
|
75
|
+
if (i !== nanoIdx) leaveRank.set(i, leaveRank.size);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// search box (page-space CSS px) + typing beats
|
|
79
|
+
const SEARCH = { x: 408, y: 130, w: 1016, h: 44 };
|
|
80
|
+
const QUERY = 'nano-lab';
|
|
81
|
+
const TYPE_START = 128; // 3 frames per character → last char at ≈149
|
|
82
|
+
const FILTER_START = 160; // beat of rest after typing, then the grid filters
|
|
83
|
+
|
|
84
|
+
// pile centre for the opening close-up
|
|
85
|
+
const PILE_CX = PILE.x + CARD_W / 2;
|
|
86
|
+
const PILE_CY = PILE.y + 156;
|
|
87
|
+
|
|
88
|
+
// Narrative: the shot opens on a rotating 3D CLOSE-UP of the 26-card pile
|
|
89
|
+
// (orbiting from a left-oblique to a right-oblique look), pulls back to
|
|
90
|
+
// reveal the page as the pile starts dealing cards to their grid slots, each
|
|
91
|
+
// departure faster than the last, extending the grid far below the page fold
|
|
92
|
+
// → the camera scrolls down chasing the dealing, FASTER each leg, arriving
|
|
93
|
+
// straight at the bottom → rests half a second on the full board → swooshes
|
|
94
|
+
// back up to the search box → "nano-lab" is typed (unhurried), a breath, then
|
|
95
|
+
// the grid filters down to one card which slides into the first row → a click
|
|
96
|
+
// ripple fires and the camera pushes into the card, handing off to detail.
|
|
97
|
+
const CAM_KEYS: CamKey[] = [
|
|
98
|
+
{ frame: 0, cx: PILE_CX - 30, cy: PILE_CY + 60, zoom: 1.95, rotX: 46, rotY: -30, rotZ: 9, persp: 1100 }, // low side view of the stack, left-oblique
|
|
99
|
+
{ frame: 34, cx: PILE_CX + 30, cy: PILE_CY + 40, zoom: 1.85, rotX: 42, rotY: 26, rotZ: -7, persp: 1100 }, // orbit around the pile to a right-oblique
|
|
100
|
+
{ frame: 62, cx: 960, cy: 900, zoom: 0.88, rotX: 26, rotY: 0, rotZ: 2, persp: 1300 }, // pull back — dashboard revealed, dealing underway
|
|
101
|
+
{ frame: 82, cx: 950, cy: 1900, zoom: 0.78, rotX: 14, rotY: 0, rotZ: 0, persp: 1300 }, // speeding up (~50 px/f)
|
|
102
|
+
{ frame: 98, cx: 960, cy: 3032, zoom: 0.72, rotX: 0, rotY: 0, rotZ: 0, persp: 1300 }, // fastest leg (~70 px/f), arrives straight at the paper's flush bottom
|
|
103
|
+
{ frame: 113, cx: 960, cy: 3032, zoom: 0.72, rotX: 0, rotY: 0, rotZ: 0, persp: 1300 }, // 0.5s REST on the full board
|
|
104
|
+
{ frame: 124, cx: 960, cy: 380, zoom: 0.9, rotX: 0, rotY: 0, rotZ: 0, persp: 1300 }, // swoosh back up to the search/filter header
|
|
105
|
+
{ frame: 174, cx: 960, cy: 380, zoom: 0.9, rotX: 0, rotY: 0, rotZ: 0, persp: 1300 }, // hold through typing, breath, filter, slide
|
|
106
|
+
{ frame: 190, cx: CLICK_C.x, cy: CLICK_C.y, zoom: 2.2, rotX: 0, rotY: 0, rotZ: 0, persp: 1300 }, // push into the clicked card, carried through the white flash
|
|
107
|
+
];
|
|
108
|
+
|
|
109
|
+
export const SceneFlyIn: React.FC = () => {
|
|
110
|
+
const frame = useCurrentFrame();
|
|
111
|
+
|
|
112
|
+
// DOF fades out over the straightening leg of the scroll (82 → 98)
|
|
113
|
+
const dofStrength = interpolate(frame, [82, 98], [5, 0], {
|
|
114
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// typed characters: one every 3 frames from TYPE_START (unhurried typing)
|
|
118
|
+
const typedCount = frame < TYPE_START
|
|
119
|
+
? 0
|
|
120
|
+
: Math.min(QUERY.length, Math.floor((frame - TYPE_START) / 3) + 1);
|
|
121
|
+
// caret: solid while typing, then blinks on an 8-frame cycle until the click
|
|
122
|
+
const caretOn =
|
|
123
|
+
frame >= TYPE_START - 2 &&
|
|
124
|
+
frame <= 185 &&
|
|
125
|
+
(frame <= TYPE_START + 24 || Math.floor((frame - (TYPE_START + 24)) / 8) % 2 === 0);
|
|
126
|
+
|
|
127
|
+
return (
|
|
128
|
+
<PageCam
|
|
129
|
+
src="textures/live/projects-empty.png"
|
|
130
|
+
pageH={PAGE_H}
|
|
131
|
+
keys={CAM_KEYS}
|
|
132
|
+
ease={Easing.bezier(0.33, 0, 0.15, 1)}
|
|
133
|
+
dof={dofStrength > 0.1 ? { focusY: 260, strength: dofStrength } : undefined}
|
|
134
|
+
>
|
|
135
|
+
{/* ---- dark brushed-metal table under the opening pile close-up: a huge
|
|
136
|
+
plane (covers the viewport at any oblique angle) with a warm
|
|
137
|
+
spotlight pooled on the stack; fades away as the camera pulls
|
|
138
|
+
back and the dashboard page takes over ---- */}
|
|
139
|
+
{frame < METAL_FADE[1] ? (
|
|
140
|
+
<div
|
|
141
|
+
style={{
|
|
142
|
+
position: 'absolute',
|
|
143
|
+
left: -3000,
|
|
144
|
+
top: -3000,
|
|
145
|
+
width: 9000,
|
|
146
|
+
height: 9000,
|
|
147
|
+
opacity: interpolate(frame, [METAL_FADE[0], METAL_FADE[1]], [1, 0], {
|
|
148
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
149
|
+
}),
|
|
150
|
+
background: [
|
|
151
|
+
// warm key light pooled on the pile
|
|
152
|
+
`radial-gradient(1300px 900px at ${3000 + PILE_CX}px ${3000 + PILE_CY}px, rgba(255,214,150,0.20), rgba(255,190,120,0.06) 40%, transparent 68%)`,
|
|
153
|
+
// brushed-metal grain: fine anisotropic streaks
|
|
154
|
+
'repeating-linear-gradient(100deg, rgba(255,255,255,0.028) 0px, rgba(255,255,255,0.028) 1px, transparent 2px, transparent 7px)',
|
|
155
|
+
'repeating-linear-gradient(100deg, rgba(0,0,0,0.16) 0px, rgba(0,0,0,0.16) 2px, transparent 4px, transparent 13px)',
|
|
156
|
+
// broad steel sheen
|
|
157
|
+
'linear-gradient(115deg, #2a2d33 0%, #383c44 28%, #22242a 55%, #33363e 78%, #1d1f24 100%)',
|
|
158
|
+
].join(', '),
|
|
159
|
+
pointerEvents: 'none',
|
|
160
|
+
}}
|
|
161
|
+
/>
|
|
162
|
+
) : null}
|
|
163
|
+
|
|
164
|
+
{/* ---- paper extension: the page grows past the texture so the three
|
|
165
|
+
extra rows sit on paper, not on the void ---- */}
|
|
166
|
+
<div
|
|
167
|
+
style={{
|
|
168
|
+
position: 'absolute',
|
|
169
|
+
left: PAPER_EXT.x,
|
|
170
|
+
top: PAPER_EXT.y,
|
|
171
|
+
width: PAPER_EXT.w,
|
|
172
|
+
height: PAPER_EXT.h,
|
|
173
|
+
background: PAPER,
|
|
174
|
+
pointerEvents: 'none',
|
|
175
|
+
}}
|
|
176
|
+
/>
|
|
177
|
+
|
|
178
|
+
{/* ---- filter clean-up: paper patch over the stale section headers /
|
|
179
|
+
counts baked into the texture below y=500, revealed 84–92 ---- */}
|
|
180
|
+
{frame >= FILTER_START ? (
|
|
181
|
+
<div
|
|
182
|
+
style={{
|
|
183
|
+
position: 'absolute',
|
|
184
|
+
left: 0,
|
|
185
|
+
top: 500,
|
|
186
|
+
width: 1920,
|
|
187
|
+
height: PAGE_H - 500,
|
|
188
|
+
background: PAPER,
|
|
189
|
+
opacity: interpolate(frame, [FILTER_START, FILTER_START + 8], [0, 1], {
|
|
190
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
191
|
+
}),
|
|
192
|
+
pointerEvents: 'none',
|
|
193
|
+
}}
|
|
194
|
+
/>
|
|
195
|
+
) : null}
|
|
196
|
+
|
|
197
|
+
{/* ---- 26 cards: visible pile at top right from frame 0, each card
|
|
198
|
+
deals itself to its slot (arc flight, roll resolving) on an
|
|
199
|
+
accelerating cadence; on filter the 25 non-matches fade+sink
|
|
200
|
+
away and nano-lab slides up to row one ---- */}
|
|
201
|
+
{grid.map((c, i) => {
|
|
202
|
+
const { cue } = c;
|
|
203
|
+
const radius = 16;
|
|
204
|
+
const isNano = i === nanoIdx;
|
|
205
|
+
|
|
206
|
+
// --- filter fade-out for the 25 non-target cards (staggered, 5f) ---
|
|
207
|
+
const outCue = isNano ? Infinity : FILTER_START + leaveRank.get(i)! * 0.4;
|
|
208
|
+
if (frame >= outCue + 5) return null;
|
|
209
|
+
const outT = isNano
|
|
210
|
+
? 0
|
|
211
|
+
: interpolate(frame, [outCue, outCue + 5], [0, 1], {
|
|
212
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.inOut(Easing.quad),
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// --- beat 1: deal (cue → cue+8): from the pile pose (px,py, stack
|
|
216
|
+
// height pz, small roll) to the hover pose over the slot. The flight
|
|
217
|
+
// arcs UP first (z bulge) like a card snapped off the top of a deck. ---
|
|
218
|
+
const diveT = interpolate(frame, [cue, cue + 8], [0, 1], {
|
|
219
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: DIVE_EASE,
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
// --- beat 2: settle (cue+8 → cue+12): Z from HOVER_H down to 0 ---
|
|
223
|
+
const settleT = interpolate(frame, [cue + 8, cue + 12], [0, 1], {
|
|
224
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: SETTLE_EASE,
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// in-flight pose: pile → slot, roll resolving to 0 by touchdown-hover.
|
|
228
|
+
const dx = (c.px - c.x) * (1 - diveT);
|
|
229
|
+
const dy = (c.py - c.y) * (1 - diveT);
|
|
230
|
+
const rotFlight = c.protZ * (1 - diveT);
|
|
231
|
+
|
|
232
|
+
// depth: stack height → arc bulge (+90 at mid-flight) → hover → settle 0.
|
|
233
|
+
const arc = Math.sin(diveT * Math.PI) * 90;
|
|
234
|
+
const zDive = interpolate(diveT, [0, 1], [c.pz, HOVER_H]) + arc;
|
|
235
|
+
const z = frame < cue ? c.pz : zDive * (1 - settleT); // pile height before the deal
|
|
236
|
+
|
|
237
|
+
// scale: in the pile 1, snap up 1.06 mid-flight, settle back to 1
|
|
238
|
+
const dealScale = 1 + Math.sin(diveT * Math.PI) * 0.06;
|
|
239
|
+
const press = interpolate(frame, [cue + 10, cue + 11, cue + 12], [1, 0.996, 1], {
|
|
240
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
241
|
+
});
|
|
242
|
+
const scale = dealScale * press;
|
|
243
|
+
|
|
244
|
+
// --- nano-lab slide (104 → 114): glide from (408,1402) to the first-row
|
|
245
|
+
// slot with a light float (scale 1→1.02→1, small Z lift, wider shadow) ---
|
|
246
|
+
const slideT = isNano
|
|
247
|
+
? interpolate(frame, [FILTER_START, FILTER_START + 10], [0, 1], {
|
|
248
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: SLIDE_EASE,
|
|
249
|
+
})
|
|
250
|
+
: 0;
|
|
251
|
+
const slideDy = (NANO_TO.y - nano.y) * slideT;
|
|
252
|
+
const slideDx = (NANO_TO.x - nano.x) * slideT;
|
|
253
|
+
const float = Math.sin(slideT * Math.PI); // 0→1→0 across the slide
|
|
254
|
+
const slideScale = 1 + 0.02 * float;
|
|
255
|
+
const slideZ = 18 * float;
|
|
256
|
+
|
|
257
|
+
// once fully settled, force an exact identity so the card sits flush
|
|
258
|
+
// with its slot on the tilted board (no residual sub-px drift).
|
|
259
|
+
const landed = frame >= cue + 12;
|
|
260
|
+
const inPile = frame < cue;
|
|
261
|
+
const transform = isNano && frame >= FILTER_START
|
|
262
|
+
? `translate3d(${slideDx}px, ${slideDy}px, ${slideZ}px) scale(${slideScale})`
|
|
263
|
+
: outT > 0
|
|
264
|
+
? `translate3d(0px, ${8 * outT}px, 0px)`
|
|
265
|
+
: landed
|
|
266
|
+
? 'translate3d(0px, 0px, 0px)'
|
|
267
|
+
: inPile
|
|
268
|
+
? `translate3d(${c.px - c.x}px, ${c.py - c.y}px, ${c.pz}px) rotateZ(${c.protZ}deg)`
|
|
269
|
+
: `translate3d(${dx}px, ${dy}px, ${z}px) rotateZ(${rotFlight}deg) scale(${scale})`;
|
|
270
|
+
|
|
271
|
+
// shadow: stacked cards carry almost none (they sit on each other),
|
|
272
|
+
// airborne large/soft, tight when flush, widening on the slide
|
|
273
|
+
const shadow = isNano && frame >= FILTER_START
|
|
274
|
+
? `0 ${2 + 14 * float}px ${6 + 26 * float}px rgba(60,45,30,${0.08 + 0.1 * float})`
|
|
275
|
+
: landed
|
|
276
|
+
? '0 2px 6px rgba(60,45,30,.08)'
|
|
277
|
+
: inPile
|
|
278
|
+
? '0 1px 3px rgba(60,45,30,.14)'
|
|
279
|
+
: `0 ${36 - 30 * settleT}px ${70 - 60 * settleT}px rgba(60,45,30,${0.3 - 0.22 * settleT})`;
|
|
280
|
+
|
|
281
|
+
// motion-blur ghost during the deal: a faint blurred copy trailing the flight path
|
|
282
|
+
const showGhost = diveT > 0.02 && diveT < 0.98;
|
|
283
|
+
const ghostLagX = (c.px - c.x) * 0.05;
|
|
284
|
+
const ghostLagY = (c.py - c.y) * 0.05;
|
|
285
|
+
|
|
286
|
+
return (
|
|
287
|
+
<div key={`${c.file}-${i}`} style={{ transformStyle: 'preserve-3d' }}>
|
|
288
|
+
{showGhost ? (
|
|
289
|
+
<div
|
|
290
|
+
style={{
|
|
291
|
+
position: 'absolute',
|
|
292
|
+
left: c.x,
|
|
293
|
+
top: c.y,
|
|
294
|
+
width: c.w,
|
|
295
|
+
height: c.h,
|
|
296
|
+
transform: `translate3d(${dx + ghostLagX}px, ${dy + ghostLagY}px, ${z}px) rotateZ(${rotFlight}deg) scale(${scale})`,
|
|
297
|
+
transformOrigin: 'center center',
|
|
298
|
+
opacity: 0.25 * (1 - diveT),
|
|
299
|
+
filter: 'blur(6px)',
|
|
300
|
+
borderRadius: radius,
|
|
301
|
+
overflow: 'hidden',
|
|
302
|
+
pointerEvents: 'none',
|
|
303
|
+
}}
|
|
304
|
+
>
|
|
305
|
+
<Img
|
|
306
|
+
src={staticFile(`textures/live/${c.file}`)}
|
|
307
|
+
style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', display: 'block' }}
|
|
308
|
+
/>
|
|
309
|
+
</div>
|
|
310
|
+
) : null}
|
|
311
|
+
|
|
312
|
+
<div
|
|
313
|
+
style={{
|
|
314
|
+
position: 'absolute',
|
|
315
|
+
left: c.x,
|
|
316
|
+
top: c.y,
|
|
317
|
+
width: c.w,
|
|
318
|
+
height: c.h,
|
|
319
|
+
transform,
|
|
320
|
+
transformOrigin: 'center center',
|
|
321
|
+
boxShadow: shadow,
|
|
322
|
+
borderRadius: radius,
|
|
323
|
+
opacity: 1 - outT,
|
|
324
|
+
overflow: 'hidden',
|
|
325
|
+
}}
|
|
326
|
+
>
|
|
327
|
+
<Img
|
|
328
|
+
src={staticFile(`textures/live/${c.file}`)}
|
|
329
|
+
style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', display: 'block' }}
|
|
330
|
+
/>
|
|
331
|
+
</div>
|
|
332
|
+
</div>
|
|
333
|
+
);
|
|
334
|
+
})}
|
|
335
|
+
|
|
336
|
+
{/* ---- search box: paper patch over the placeholder text (keeps the
|
|
337
|
+
magnifier icon), then "nano-lab" typed in with a blinking caret ---- */}
|
|
338
|
+
{frame >= 118 ? (
|
|
339
|
+
<div
|
|
340
|
+
style={{
|
|
341
|
+
position: 'absolute',
|
|
342
|
+
left: 440,
|
|
343
|
+
top: SEARCH.y + 4,
|
|
344
|
+
width: SEARCH.x + SEARCH.w - 448,
|
|
345
|
+
height: SEARCH.h - 8,
|
|
346
|
+
background: FIELD,
|
|
347
|
+
opacity: interpolate(frame, [118, 124], [0, 1], {
|
|
348
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
349
|
+
}),
|
|
350
|
+
pointerEvents: 'none',
|
|
351
|
+
}}
|
|
352
|
+
/>
|
|
353
|
+
) : null}
|
|
354
|
+
{frame >= TYPE_START - 2 ? (
|
|
355
|
+
<div
|
|
356
|
+
style={{
|
|
357
|
+
position: 'absolute',
|
|
358
|
+
left: 448,
|
|
359
|
+
top: SEARCH.y,
|
|
360
|
+
height: SEARCH.h,
|
|
361
|
+
display: 'flex',
|
|
362
|
+
alignItems: 'center',
|
|
363
|
+
fontFamily: 'ui-sans-serif, system-ui, -apple-system, sans-serif',
|
|
364
|
+
fontSize: 15,
|
|
365
|
+
letterSpacing: 0.2,
|
|
366
|
+
color: 'oklch(25% 0.006 82)',
|
|
367
|
+
pointerEvents: 'none',
|
|
368
|
+
}}
|
|
369
|
+
>
|
|
370
|
+
<span>{QUERY.slice(0, typedCount)}</span>
|
|
371
|
+
{caretOn ? (
|
|
372
|
+
<span
|
|
373
|
+
style={{
|
|
374
|
+
display: 'inline-block',
|
|
375
|
+
width: 2,
|
|
376
|
+
height: 20,
|
|
377
|
+
marginLeft: 2,
|
|
378
|
+
background: 'oklch(58% 0.13 65)',
|
|
379
|
+
}}
|
|
380
|
+
/>
|
|
381
|
+
) : null}
|
|
382
|
+
</div>
|
|
383
|
+
) : null}
|
|
384
|
+
|
|
385
|
+
{/* ---- click ripple on the filtered card: two concentric amber rings ---- */}
|
|
386
|
+
{[0, 1].map((r) => {
|
|
387
|
+
const start = 176 + r * 3;
|
|
388
|
+
if (frame < start || frame > start + 10) return null;
|
|
389
|
+
const t = interpolate(frame, [start, start + 10], [0, 1], {
|
|
390
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.out(Easing.cubic),
|
|
391
|
+
});
|
|
392
|
+
const rad = interpolate(t, [0, 1], [14, r === 0 ? 54 : 78]);
|
|
393
|
+
return (
|
|
394
|
+
<div
|
|
395
|
+
key={`ripple-${r}`}
|
|
396
|
+
style={{
|
|
397
|
+
position: 'absolute',
|
|
398
|
+
left: CLICK_C.x - rad,
|
|
399
|
+
top: CLICK_C.y - rad,
|
|
400
|
+
width: rad * 2,
|
|
401
|
+
height: rad * 2,
|
|
402
|
+
borderRadius: '50%',
|
|
403
|
+
border: '2px solid oklch(58% 0.13 65)',
|
|
404
|
+
opacity: 1 - t,
|
|
405
|
+
pointerEvents: 'none',
|
|
406
|
+
}}
|
|
407
|
+
/>
|
|
408
|
+
);
|
|
409
|
+
})}
|
|
410
|
+
|
|
411
|
+
{/* ---- selected-card amber outline, lit from the click until the cut ---- */}
|
|
412
|
+
{frame >= 178 ? (
|
|
413
|
+
<div
|
|
414
|
+
style={{
|
|
415
|
+
position: 'absolute',
|
|
416
|
+
left: NANO_TO.x - 6,
|
|
417
|
+
top: NANO_TO.y - 6,
|
|
418
|
+
width: nano.w + 12,
|
|
419
|
+
height: nano.h + 12,
|
|
420
|
+
borderRadius: 16,
|
|
421
|
+
border: '3px solid oklch(58% 0.13 65)',
|
|
422
|
+
boxShadow: '0 0 40px rgba(180,120,50,0.5)',
|
|
423
|
+
opacity: interpolate(frame, [178, 181], [0.5, 1], {
|
|
424
|
+
extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
|
|
425
|
+
}),
|
|
426
|
+
pointerEvents: 'none',
|
|
427
|
+
}}
|
|
428
|
+
/>
|
|
429
|
+
) : null}
|
|
430
|
+
|
|
431
|
+
{/* near-edge rim light along the extended board's leading (bottom) edge */}
|
|
432
|
+
<div
|
|
433
|
+
style={{
|
|
434
|
+
position: 'absolute',
|
|
435
|
+
left: 0,
|
|
436
|
+
right: 0,
|
|
437
|
+
top: PAPER_EXT.y + PAPER_EXT.h - 8,
|
|
438
|
+
height: 8,
|
|
439
|
+
background: 'rgba(255,255,255,0.85)',
|
|
440
|
+
filter: 'blur(6px)',
|
|
441
|
+
opacity: 0.5,
|
|
442
|
+
pointerEvents: 'none',
|
|
443
|
+
}}
|
|
444
|
+
/>
|
|
445
|
+
</PageCam>
|
|
446
|
+
);
|
|
447
|
+
};
|