hyper-animator-codex 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/README.md +51 -3
  2. package/bin/hyper-animator-codex.mjs +1 -1
  3. package/lib/minimax-config.mjs +3 -3
  4. package/package.json +1 -1
  5. package/skills/hyper-animator-codex/SKILL.md +58 -20
  6. package/skills/hyper-animator-codex/agents/openai.yaml +2 -2
  7. package/skills/hyper-animator-codex/contracts/shot-plan.schema.json +214 -0
  8. package/skills/hyper-animator-codex/contracts/workflow-policy.json +85 -0
  9. package/skills/hyper-animator-codex/references/HyperFrames-AI-Generation-Patterns-codex.md +788 -0
  10. package/skills/hyper-animator-codex/references/beat-sync-workflow.md +7 -0
  11. package/skills/hyper-animator-codex/references/examples/shot-plan-dual-catalog.json +69 -0
  12. package/skills/hyper-animator-codex/references/hyperframes-agent-pseudocode.ts +1 -1
  13. package/skills/hyper-animator-codex/references/hyperframes-catalog-map.json +97 -230
  14. package/skills/hyper-animator-codex/references/hyperframes-intent-workflow.md +23 -7
  15. package/skills/hyper-animator-codex/references/minimax-music-workflow.md +24 -4
  16. package/skills/hyper-animator-codex/references/narration-audio-workflow.md +31 -1
  17. package/skills/hyper-animator-codex/references/shotcraft/LICENSE +202 -0
  18. package/skills/hyper-animator-codex/references/shotcraft/cards/ai-stream-response/README.md +46 -0
  19. package/skills/hyper-animator-codex/references/shotcraft/cards/autolayout-gap-dial/README.md +53 -0
  20. package/skills/hyper-animator-codex/references/shotcraft/cards/beat-cut-moves/README.md +54 -0
  21. package/skills/hyper-animator-codex/references/shotcraft/cards/beat-step-list-theme-cycle/README.md +59 -0
  22. package/skills/hyper-animator-codex/references/shotcraft/cards/before-after-slider-scrub/README.md +47 -0
  23. package/skills/hyper-animator-codex/references/shotcraft/cards/bottom-push-stack-wipe/README.md +58 -0
  24. package/skills/hyper-animator-codex/references/shotcraft/cards/brand-frame-snap/README.md +51 -0
  25. package/skills/hyper-animator-codex/references/shotcraft/cards/brand-ink-open/README.md +35 -0
  26. package/skills/hyper-animator-codex/references/shotcraft/cards/bubble-swarm-takeover/README.md +62 -0
  27. package/skills/hyper-animator-codex/references/shotcraft/cards/canvas-materialize-moves/README.md +55 -0
  28. package/skills/hyper-animator-codex/references/shotcraft/cards/card-flip-reveal/README.md +50 -0
  29. package/skills/hyper-animator-codex/references/shotcraft/cards/card-flock-tumble/README.md +54 -0
  30. package/skills/hyper-animator-codex/references/shotcraft/cards/cel-flash-stomp/README.md +54 -0
  31. package/skills/hyper-animator-codex/references/shotcraft/cards/chart-live-moves/README.md +51 -0
  32. package/skills/hyper-animator-codex/references/shotcraft/cards/circle-match-iris/README.md +53 -0
  33. package/skills/hyper-animator-codex/references/shotcraft/cards/cloner-depth-echo/README.md +38 -0
  34. package/skills/hyper-animator-codex/references/shotcraft/cards/collab-cursor-moves/README.md +48 -0
  35. package/skills/hyper-animator-codex/references/shotcraft/cards/color-block-step-wipe/README.md +54 -0
  36. package/skills/hyper-animator-codex/references/shotcraft/cards/command-palette-summon/README.md +45 -0
  37. package/skills/hyper-animator-codex/references/shotcraft/cards/crane-rise-reveal/README.md +47 -0
  38. package/skills/hyper-animator-codex/references/shotcraft/cards/crash-zoom-punch/README.md +38 -0
  39. package/skills/hyper-animator-codex/references/shotcraft/cards/dataviz-landscape-open/README.md +54 -0
  40. package/skills/hyper-animator-codex/references/shotcraft/cards/deck-deal-flyin/README.md +45 -0
  41. package/skills/hyper-animator-codex/references/shotcraft/cards/depth-layer-moves/README.md +40 -0
  42. package/skills/hyper-animator-codex/references/shotcraft/cards/document-typewriter-reveal/README.md +40 -0
  43. package/skills/hyper-animator-codex/references/shotcraft/cards/draw-svg-trace/README.md +50 -0
  44. package/skills/hyper-animator-codex/references/shotcraft/cards/edit-hook-moves/README.md +38 -0
  45. package/skills/hyper-animator-codex/references/shotcraft/cards/element-body-moves/README.md +49 -0
  46. package/skills/hyper-animator-codex/references/shotcraft/cards/fui-hud-moves/README.md +44 -0
  47. package/skills/hyper-animator-codex/references/shotcraft/cards/gauge-readout-moves/README.md +45 -0
  48. package/skills/hyper-animator-codex/references/shotcraft/cards/glow-flyline-moves/README.md +51 -0
  49. package/skills/hyper-animator-codex/references/shotcraft/cards/gradient-word-sweep/README.md +49 -0
  50. package/skills/hyper-animator-codex/references/shotcraft/cards/graze-face-tour/README.md +56 -0
  51. package/skills/hyper-animator-codex/references/shotcraft/cards/hashtag-to-pill-materialize/README.md +57 -0
  52. package/skills/hyper-animator-codex/references/shotcraft/cards/hires-rasterize-3d-text/README.md +34 -0
  53. package/skills/hyper-animator-codex/references/shotcraft/cards/icon-field-colorize/README.md +53 -0
  54. package/skills/hyper-animator-codex/references/shotcraft/cards/icon-performance-moves/README.md +46 -0
  55. package/skills/hyper-animator-codex/references/shotcraft/cards/impact-feedback/README.md +50 -0
  56. package/skills/hyper-animator-codex/references/shotcraft/cards/input-trigger-moves/README.md +49 -0
  57. package/skills/hyper-animator-codex/references/shotcraft/cards/integration-hub-map/README.md +54 -0
  58. package/skills/hyper-animator-codex/references/shotcraft/cards/letterspace-materialize/README.md +52 -0
  59. package/skills/hyper-animator-codex/references/shotcraft/cards/light-play-moves/README.md +49 -0
  60. package/skills/hyper-animator-codex/references/shotcraft/cards/line-boil/README.md +52 -0
  61. package/skills/hyper-animator-codex/references/shotcraft/cards/line-carry-transition/README.md +52 -0
  62. package/skills/hyper-animator-codex/references/shotcraft/cards/list-stack-press/README.md +43 -0
  63. package/skills/hyper-animator-codex/references/shotcraft/cards/magician-card-flourish/README.md +63 -0
  64. package/skills/hyper-animator-codex/references/shotcraft/cards/marker-underline-title/README.md +48 -0
  65. package/skills/hyper-animator-codex/references/shotcraft/cards/montage-rhythm-moves/README.md +55 -0
  66. package/skills/hyper-animator-codex/references/shotcraft/cards/morph-from-primitive/README.md +51 -0
  67. package/skills/hyper-animator-codex/references/shotcraft/cards/neon-frame-forerun/README.md +50 -0
  68. package/skills/hyper-animator-codex/references/shotcraft/cards/neon-frame-orbit-drop/README.md +50 -0
  69. package/skills/hyper-animator-codex/references/shotcraft/cards/neon-triple-marquee/README.md +55 -0
  70. package/skills/hyper-animator-codex/references/shotcraft/cards/odometer-digit-roll/README.md +54 -0
  71. package/skills/hyper-animator-codex/references/shotcraft/cards/outro-group-photo-launch/README.md +39 -0
  72. package/skills/hyper-animator-codex/references/shotcraft/cards/overhead-camera-moves/README.md +50 -0
  73. package/skills/hyper-animator-codex/references/shotcraft/cards/page-turn-transitions/README.md +48 -0
  74. package/skills/hyper-animator-codex/references/shotcraft/cards/page-waterfall-wall/README.md +52 -0
  75. package/skills/hyper-animator-codex/references/shotcraft/cards/panel-grid-moves/README.md +52 -0
  76. package/skills/hyper-animator-codex/references/shotcraft/cards/paper-craft-moves/README.md +46 -0
  77. package/skills/hyper-animator-codex/references/shotcraft/cards/paper-plane-messenger/README.md +62 -0
  78. package/skills/hyper-animator-codex/references/shotcraft/cards/paper-title-card/README.md +36 -0
  79. package/skills/hyper-animator-codex/references/shotcraft/cards/particle-celebrate-hits/README.md +42 -0
  80. package/skills/hyper-animator-codex/references/shotcraft/cards/particle-sand-fill/README.md +39 -0
  81. package/skills/hyper-animator-codex/references/shotcraft/cards/pill-slot-cycle/README.md +57 -0
  82. package/skills/hyper-animator-codex/references/shotcraft/cards/print-texture-transitions/README.md +40 -0
  83. package/skills/hyper-animator-codex/references/shotcraft/cards/rhythm-interrupt-moves/README.md +44 -0
  84. package/skills/hyper-animator-codex/references/shotcraft/cards/riso-print-hits/README.md +54 -0
  85. package/skills/hyper-animator-codex/references/shotcraft/cards/row-embed/README.md +36 -0
  86. package/skills/hyper-animator-codex/references/shotcraft/cards/runway-ground-skim/README.md +52 -0
  87. package/skills/hyper-animator-codex/references/shotcraft/cards/sakuga-timing-shift/README.md +50 -0
  88. package/skills/hyper-animator-codex/references/shotcraft/cards/scene-locked-title/README.md +43 -0
  89. package/skills/hyper-animator-codex/references/shotcraft/cards/scroll-brake-moves/README.md +45 -0
  90. package/skills/hyper-animator-codex/references/shotcraft/cards/segmented-thumb-hero/README.md +57 -0
  91. package/skills/hyper-animator-codex/references/shotcraft/cards/shot-transitions/README.md +60 -0
  92. package/skills/hyper-animator-codex/references/shotcraft/cards/skeleton-reveal/README.md +54 -0
  93. package/skills/hyper-animator-codex/references/shotcraft/cards/slam-entrance-moves/README.md +53 -0
  94. package/skills/hyper-animator-codex/references/shotcraft/cards/smear-multiples/README.md +49 -0
  95. package/skills/hyper-animator-codex/references/shotcraft/cards/space-camera-moves/README.md +53 -0
  96. package/skills/hyper-animator-codex/references/shotcraft/cards/spectrum-morph-ui/README.md +50 -0
  97. package/skills/hyper-animator-codex/references/shotcraft/cards/speed-ramp-freeze/README.md +42 -0
  98. package/skills/hyper-animator-codex/references/shotcraft/cards/split-flap-title/README.md +52 -0
  99. package/skills/hyper-animator-codex/references/shotcraft/cards/spotlight-hero-card/README.md +39 -0
  100. package/skills/hyper-animator-codex/references/shotcraft/cards/spotlight-sweep-moves/README.md +51 -0
  101. package/skills/hyper-animator-codex/references/shotcraft/cards/steep-tilt-glide/README.md +53 -0
  102. package/skills/hyper-animator-codex/references/shotcraft/cards/stroke-segment-build/README.md +43 -0
  103. package/skills/hyper-animator-codex/references/shotcraft/cards/tear-streak-transitions/README.md +43 -0
  104. package/skills/hyper-animator-codex/references/shotcraft/cards/tension-camera-moves/README.md +55 -0
  105. package/skills/hyper-animator-codex/references/shotcraft/cards/text-as-mask/README.md +50 -0
  106. package/skills/hyper-animator-codex/references/shotcraft/cards/text-column-converge/README.md +55 -0
  107. package/skills/hyper-animator-codex/references/shotcraft/cards/theme-switch-moves/README.md +44 -0
  108. package/skills/hyper-animator-codex/references/shotcraft/cards/timeline-travel/README.md +43 -0
  109. package/skills/hyper-animator-codex/references/shotcraft/cards/title-demote-to-label/README.md +58 -0
  110. package/skills/hyper-animator-codex/references/shotcraft/cards/trailer-grammar-moves/README.md +51 -0
  111. package/skills/hyper-animator-codex/references/shotcraft/cards/transition-hidden-cut/README.md +52 -0
  112. package/skills/hyper-animator-codex/references/shotcraft/cards/transition-travel/README.md +48 -0
  113. package/skills/hyper-animator-codex/references/shotcraft/cards/type-and-filter/README.md +37 -0
  114. package/skills/hyper-animator-codex/references/shotcraft/cards/type-assembly-moves/README.md +50 -0
  115. package/skills/hyper-animator-codex/references/shotcraft/cards/type-entrance-moves/README.md +46 -0
  116. package/skills/hyper-animator-codex/references/shotcraft/cards/type-rhythm-sync/README.md +47 -0
  117. package/skills/hyper-animator-codex/references/shotcraft/cards/typewriter-moves/README.md +50 -0
  118. package/skills/hyper-animator-codex/references/shotcraft/cards/ui-strip-away-outro/README.md +63 -0
  119. package/skills/hyper-animator-codex/references/shotcraft/cards/ui-to-brand-morph/README.md +52 -0
  120. package/skills/hyper-animator-codex/references/shotcraft/cards/voice-waveform-live/README.md +52 -0
  121. package/skills/hyper-animator-codex/references/shotcraft/cards/wall-reveal-moves/README.md +53 -0
  122. package/skills/hyper-animator-codex/references/shotcraft/cards/wipe-transitions/README.md +47 -0
  123. package/skills/hyper-animator-codex/references/shotcraft/cards/word-relay-filmstrip/README.md +50 -0
  124. package/skills/hyper-animator-codex/references/shotcraft/catalog.json +3946 -0
  125. package/skills/hyper-animator-codex/references/shotcraft/references/aesthetic-rules.md +157 -0
  126. package/skills/hyper-animator-codex/references/shotcraft/references/final-review.md +107 -0
  127. package/skills/hyper-animator-codex/references/shotcraft/references/guided-free-creation.md +197 -0
  128. package/skills/hyper-animator-codex/references/shotcraft/references/music-beat-sync.md +125 -0
  129. package/skills/hyper-animator-codex/references/shotcraft/references/pipeline.md +357 -0
  130. package/skills/hyper-animator-codex/references/shotcraft/references/sound-design.md +126 -0
  131. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/Caption.tsx +50 -0
  132. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/DigitRoll.tsx +45 -0
  133. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/FlashCut.tsx +20 -0
  134. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/FlatPanel.tsx +65 -0
  135. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/PageCam.tsx +151 -0
  136. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/VerticalTicker.tsx +129 -0
  137. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/camera.tsx +75 -0
  138. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/motion.ts +40 -0
  139. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/rand.ts +11 -0
  140. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/shake.ts +10 -0
  141. package/skills/hyper-animator-codex/references/shotcraft/source/demos/_fixtures/Fixtures.tsx +83 -0
  142. package/skills/hyper-animator-codex/references/shotcraft/source/demos/ai-stream-response/StreamResponse.tsx +146 -0
  143. package/skills/hyper-animator-codex/references/shotcraft/source/demos/autolayout-gap-dial/AutolayoutGapDial.tsx +174 -0
  144. package/skills/hyper-animator-codex/references/shotcraft/source/demos/beat-cut-moves/BeatCutAccelerando.tsx +77 -0
  145. package/skills/hyper-animator-codex/references/shotcraft/source/demos/beat-cut-moves/PaparazziFlash.tsx +115 -0
  146. package/skills/hyper-animator-codex/references/shotcraft/source/demos/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +98 -0
  147. package/skills/hyper-animator-codex/references/shotcraft/source/demos/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +99 -0
  148. package/skills/hyper-animator-codex/references/shotcraft/source/demos/bottom-push-stack-wipe/BottomPushStackWipe.tsx +79 -0
  149. package/skills/hyper-animator-codex/references/shotcraft/source/demos/brand-frame-snap/BrandFrameSnap.tsx +110 -0
  150. package/skills/hyper-animator-codex/references/shotcraft/source/demos/bubble-swarm-takeover/BubbleSwarmTakeover.tsx +189 -0
  151. package/skills/hyper-animator-codex/references/shotcraft/source/demos/canvas-materialize-moves/DiagramCascadeBuild.tsx +172 -0
  152. package/skills/hyper-animator-codex/references/shotcraft/source/demos/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +254 -0
  153. package/skills/hyper-animator-codex/references/shotcraft/source/demos/card-flip-reveal/CardFlipReveal.tsx +139 -0
  154. package/skills/hyper-animator-codex/references/shotcraft/source/demos/card-flock-tumble/CardFlockTumble.tsx +382 -0
  155. package/skills/hyper-animator-codex/references/shotcraft/source/demos/cel-flash-stomp/CelFlashStomp.tsx +111 -0
  156. package/skills/hyper-animator-codex/references/shotcraft/source/demos/chart-live-moves/AxisRescaleShockV2.tsx +282 -0
  157. package/skills/hyper-animator-codex/references/shotcraft/source/demos/chart-live-moves/OscilloscopeStreamV2.tsx +227 -0
  158. package/skills/hyper-animator-codex/references/shotcraft/source/demos/chart-live-moves/UnitDotSwarmRegroupV2.tsx +248 -0
  159. package/skills/hyper-animator-codex/references/shotcraft/source/demos/circle-match-iris/CircleMatchIris.tsx +124 -0
  160. package/skills/hyper-animator-codex/references/shotcraft/source/demos/cloner-depth-echo/ClonerDepthEcho.tsx +90 -0
  161. package/skills/hyper-animator-codex/references/shotcraft/source/demos/collab-cursor-moves/CursorCastEnsemble.tsx +136 -0
  162. package/skills/hyper-animator-codex/references/shotcraft/source/demos/collab-cursor-moves/CursorDialogueDuet.tsx +145 -0
  163. package/skills/hyper-animator-codex/references/shotcraft/source/demos/color-block-step-wipe/ColorBlockStepWipe.tsx +157 -0
  164. package/skills/hyper-animator-codex/references/shotcraft/source/demos/command-palette-summon/CommandPaletteSummon.tsx +173 -0
  165. package/skills/hyper-animator-codex/references/shotcraft/source/demos/crane-rise-reveal/CraneRiseReveal.tsx +91 -0
  166. package/skills/hyper-animator-codex/references/shotcraft/source/demos/crash-zoom-punch/CrashImpactReal.tsx +63 -0
  167. package/skills/hyper-animator-codex/references/shotcraft/source/demos/crash-zoom-punch/CrashZoomReal.tsx +60 -0
  168. package/skills/hyper-animator-codex/references/shotcraft/source/demos/dataviz-landscape-open/DatavizLandscapeOpen.tsx +401 -0
  169. package/skills/hyper-animator-codex/references/shotcraft/source/demos/depth-layer-moves/DollyZoomReal.tsx +55 -0
  170. package/skills/hyper-animator-codex/references/shotcraft/source/demos/depth-layer-moves/MultiplaneReal.tsx +45 -0
  171. package/skills/hyper-animator-codex/references/shotcraft/source/demos/draw-svg-trace/DrawSvgTrace.tsx +199 -0
  172. package/skills/hyper-animator-codex/references/shotcraft/source/demos/edit-hook-moves/LogoStingButton.tsx +106 -0
  173. package/skills/hyper-animator-codex/references/shotcraft/source/demos/element-body-moves/AxialStretch.tsx +112 -0
  174. package/skills/hyper-animator-codex/references/shotcraft/source/demos/element-body-moves/ContactShadowLift.tsx +117 -0
  175. package/skills/hyper-animator-codex/references/shotcraft/source/demos/fui-hud-moves/LineUnfoldPanel.tsx +125 -0
  176. package/skills/hyper-animator-codex/references/shotcraft/source/demos/fui-hud-moves/ReticleLockOn.tsx +139 -0
  177. package/skills/hyper-animator-codex/references/shotcraft/source/demos/gauge-readout-moves/NeedleSweepSelftest.tsx +146 -0
  178. package/skills/hyper-animator-codex/references/shotcraft/source/demos/gauge-readout-moves/TapeScrollFixedPointer.tsx +120 -0
  179. package/skills/hyper-animator-codex/references/shotcraft/source/demos/glow-flyline-moves/FlylineArc.tsx +158 -0
  180. package/skills/hyper-animator-codex/references/shotcraft/source/demos/glow-flyline-moves/GlowOrbAmbient.tsx +131 -0
  181. package/skills/hyper-animator-codex/references/shotcraft/source/demos/glow-flyline-moves/OrbFlylineRelay.tsx +268 -0
  182. package/skills/hyper-animator-codex/references/shotcraft/source/demos/gradient-word-sweep/GradientWordSweep.tsx +307 -0
  183. package/skills/hyper-animator-codex/references/shotcraft/source/demos/graze-face-tour/GrazeFaceTour.tsx +469 -0
  184. package/skills/hyper-animator-codex/references/shotcraft/source/demos/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +166 -0
  185. package/skills/hyper-animator-codex/references/shotcraft/source/demos/icon-field-colorize/IconFieldColorize.tsx +93 -0
  186. package/skills/hyper-animator-codex/references/shotcraft/source/demos/icon-performance-moves/AttentionBounce.tsx +193 -0
  187. package/skills/hyper-animator-codex/references/shotcraft/source/demos/icon-performance-moves/PopBurstConfirm.tsx +162 -0
  188. package/skills/hyper-animator-codex/references/shotcraft/source/demos/impact-feedback/AnimeImpact.tsx +149 -0
  189. package/skills/hyper-animator-codex/references/shotcraft/source/demos/impact-feedback/HitCounter.tsx +147 -0
  190. package/skills/hyper-animator-codex/references/shotcraft/source/demos/input-trigger-moves/CursorPerformancePunchIn.tsx +154 -0
  191. package/skills/hyper-animator-codex/references/shotcraft/source/demos/input-trigger-moves/KeycapSmashCut.tsx +217 -0
  192. package/skills/hyper-animator-codex/references/shotcraft/source/demos/integration-hub-map/IntegrationHubMap.tsx +554 -0
  193. package/skills/hyper-animator-codex/references/shotcraft/source/demos/letterspace-materialize/LetterspaceMaterialize.tsx +85 -0
  194. package/skills/hyper-animator-codex/references/shotcraft/source/demos/light-play-moves/HalationBloom.tsx +139 -0
  195. package/skills/hyper-animator-codex/references/shotcraft/source/demos/light-play-moves/SheenSweepRetry.tsx +85 -0
  196. package/skills/hyper-animator-codex/references/shotcraft/source/demos/light-play-moves/SpotlightSweepReveal.tsx +102 -0
  197. package/skills/hyper-animator-codex/references/shotcraft/source/demos/line-boil/LineBoil.tsx +140 -0
  198. package/skills/hyper-animator-codex/references/shotcraft/source/demos/line-carry-transition/LineCarryTransition.tsx +151 -0
  199. package/skills/hyper-animator-codex/references/shotcraft/source/demos/magician-card-flourish/MagicianCardFlourish.tsx +294 -0
  200. package/skills/hyper-animator-codex/references/shotcraft/source/demos/marker-underline-title/MarkerUnderlineTitle.tsx +87 -0
  201. package/skills/hyper-animator-codex/references/shotcraft/source/demos/montage-rhythm-moves/DominoCascade.tsx +125 -0
  202. package/skills/hyper-animator-codex/references/shotcraft/source/demos/montage-rhythm-moves/DropBlackoutSlam.tsx +135 -0
  203. package/skills/hyper-animator-codex/references/shotcraft/source/demos/montage-rhythm-moves/WrightTripleCut.tsx +175 -0
  204. package/skills/hyper-animator-codex/references/shotcraft/source/demos/morph-from-primitive/MorphFromPrimitive.tsx +190 -0
  205. package/skills/hyper-animator-codex/references/shotcraft/source/demos/neon-frame-forerun/NeonFrameForerun.tsx +279 -0
  206. package/skills/hyper-animator-codex/references/shotcraft/source/demos/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +273 -0
  207. package/skills/hyper-animator-codex/references/shotcraft/source/demos/neon-triple-marquee/NeonTripleMarquee.tsx +111 -0
  208. package/skills/hyper-animator-codex/references/shotcraft/source/demos/odometer-digit-roll/OdometerDigitRoll.tsx +178 -0
  209. package/skills/hyper-animator-codex/references/shotcraft/source/demos/overhead-camera-moves/OverheadTabletopDrop.tsx +129 -0
  210. package/skills/hyper-animator-codex/references/shotcraft/source/demos/overhead-camera-moves/TiltReveal.tsx +55 -0
  211. package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-turn-transitions/BarnDoorSplit.tsx +138 -0
  212. package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-turn-transitions/CubeRotate.tsx +114 -0
  213. package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-waterfall-wall/PageWaterfallWall.tsx +76 -0
  214. package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-waterfall-wall/VerticalTicker.tsx +129 -0
  215. package/skills/hyper-animator-codex/references/shotcraft/source/demos/panel-grid-moves/ComicPanelSplit.tsx +171 -0
  216. package/skills/hyper-animator-codex/references/shotcraft/source/demos/panel-grid-moves/FlipGridReflow.tsx +121 -0
  217. package/skills/hyper-animator-codex/references/shotcraft/source/demos/panel-grid-moves/GridFlashMosaic.tsx +182 -0
  218. package/skills/hyper-animator-codex/references/shotcraft/source/demos/paper-craft-moves/MaskingTapeSlap.tsx +163 -0
  219. package/skills/hyper-animator-codex/references/shotcraft/source/demos/paper-craft-moves/PopupBookRise.tsx +134 -0
  220. package/skills/hyper-animator-codex/references/shotcraft/source/demos/paper-plane-messenger/PaperPlaneMessenger.tsx +183 -0
  221. package/skills/hyper-animator-codex/references/shotcraft/source/demos/particle-celebrate-hits/ConfettiCrossfire.tsx +115 -0
  222. package/skills/hyper-animator-codex/references/shotcraft/source/demos/particle-celebrate-hits/CounterTickSparks.tsx +103 -0
  223. package/skills/hyper-animator-codex/references/shotcraft/source/demos/particle-sand-fill/ParticleSandFill.tsx +119 -0
  224. package/skills/hyper-animator-codex/references/shotcraft/source/demos/pill-slot-cycle/PillSlotCycle.tsx +220 -0
  225. package/skills/hyper-animator-codex/references/shotcraft/source/demos/print-texture-transitions/InkBleedReveal.tsx +81 -0
  226. package/skills/hyper-animator-codex/references/shotcraft/source/demos/rhythm-interrupt-moves/JumpCutPunchIn.tsx +72 -0
  227. package/skills/hyper-animator-codex/references/shotcraft/source/demos/rhythm-interrupt-moves/StrobeBlackFrames.tsx +99 -0
  228. package/skills/hyper-animator-codex/references/shotcraft/source/demos/riso-print-hits/RisoBeatPump.tsx +155 -0
  229. package/skills/hyper-animator-codex/references/shotcraft/source/demos/riso-print-hits/RisoMisregistrationHit.tsx +120 -0
  230. package/skills/hyper-animator-codex/references/shotcraft/source/demos/runway-ground-skim/RunwayGroundSkim.tsx +258 -0
  231. package/skills/hyper-animator-codex/references/shotcraft/source/demos/sakuga-timing-shift/SakugaTimingShift.tsx +178 -0
  232. package/skills/hyper-animator-codex/references/shotcraft/source/demos/scene-locked-title/SceneLockedTitle.tsx +98 -0
  233. package/skills/hyper-animator-codex/references/shotcraft/source/demos/scroll-brake-moves/BrakeReticleLock.tsx +171 -0
  234. package/skills/hyper-animator-codex/references/shotcraft/source/demos/scroll-brake-moves/ChangelogScrollBrake.tsx +117 -0
  235. package/skills/hyper-animator-codex/references/shotcraft/source/demos/segmented-thumb-hero/SegmentedThumbHero.tsx +213 -0
  236. package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/MaskWipeReal.tsx +67 -0
  237. package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/PortalWipeV2.tsx +128 -0
  238. package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/WhipBrakeReal.tsx +60 -0
  239. package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/WhipPanReal.tsx +45 -0
  240. package/skills/hyper-animator-codex/references/shotcraft/source/demos/skeleton-reveal/SkeletonReveal.tsx +283 -0
  241. package/skills/hyper-animator-codex/references/shotcraft/source/demos/slam-entrance-moves/ImpactBurstKit.tsx +185 -0
  242. package/skills/hyper-animator-codex/references/shotcraft/source/demos/slam-entrance-moves/KanadaPerspectiveSnap.tsx +91 -0
  243. package/skills/hyper-animator-codex/references/shotcraft/source/demos/slam-entrance-moves/ScoreSlam.tsx +225 -0
  244. package/skills/hyper-animator-codex/references/shotcraft/source/demos/smear-multiples/SmearMultiples.tsx +88 -0
  245. package/skills/hyper-animator-codex/references/shotcraft/source/demos/space-camera-moves/DroneDiveLanding.tsx +91 -0
  246. package/skills/hyper-animator-codex/references/shotcraft/source/demos/space-camera-moves/ExplodedView.tsx +178 -0
  247. package/skills/hyper-animator-codex/references/shotcraft/source/demos/space-camera-moves/SnorricamLock.tsx +130 -0
  248. package/skills/hyper-animator-codex/references/shotcraft/source/demos/spectrum-morph-ui/SpectrumMorphUi.tsx +129 -0
  249. package/skills/hyper-animator-codex/references/shotcraft/source/demos/speed-ramp-freeze/FreezeAnnotateReal.tsx +70 -0
  250. package/skills/hyper-animator-codex/references/shotcraft/source/demos/speed-ramp-freeze/SpeedRampReal.tsx +58 -0
  251. package/skills/hyper-animator-codex/references/shotcraft/source/demos/split-flap-title/SplitFlapFlip.tsx +189 -0
  252. package/skills/hyper-animator-codex/references/shotcraft/source/demos/spotlight-sweep-moves/CornerSpotlightReveal.tsx +121 -0
  253. package/skills/hyper-animator-codex/references/shotcraft/source/demos/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +183 -0
  254. package/skills/hyper-animator-codex/references/shotcraft/source/demos/spotlight-sweep-moves/SlideSpotlightPan.tsx +171 -0
  255. package/skills/hyper-animator-codex/references/shotcraft/source/demos/steep-tilt-glide/SteepTiltGlide.tsx +315 -0
  256. package/skills/hyper-animator-codex/references/shotcraft/source/demos/stroke-segment-build/StrokeSegmentBuild.tsx +126 -0
  257. package/skills/hyper-animator-codex/references/shotcraft/source/demos/tear-streak-transitions/GlitchDisplace.tsx +107 -0
  258. package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/BulletTimeFreezeOrbit.tsx +219 -0
  259. package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/DutchRollToLevel.tsx +110 -0
  260. package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/PullBackIsolation.tsx +120 -0
  261. package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/SlowPushIn.tsx +96 -0
  262. package/skills/hyper-animator-codex/references/shotcraft/source/demos/text-as-mask/TextAsMask.tsx +94 -0
  263. package/skills/hyper-animator-codex/references/shotcraft/source/demos/text-column-converge/TextColumnConverge.tsx +122 -0
  264. package/skills/hyper-animator-codex/references/shotcraft/source/demos/theme-switch-moves/PaletteThemeRipple.tsx +207 -0
  265. package/skills/hyper-animator-codex/references/shotcraft/source/demos/theme-switch-moves/ThemeSweepToggle.tsx +123 -0
  266. package/skills/hyper-animator-codex/references/shotcraft/source/demos/timeline-travel/TimelineTravel.tsx +123 -0
  267. package/skills/hyper-animator-codex/references/shotcraft/source/demos/title-demote-to-label/TitleDemoteToLabel.tsx +174 -0
  268. package/skills/hyper-animator-codex/references/shotcraft/source/demos/trailer-grammar-moves/CardFootageCadence.tsx +118 -0
  269. package/skills/hyper-animator-codex/references/shotcraft/source/demos/trailer-grammar-moves/SmashCut.tsx +105 -0
  270. package/skills/hyper-animator-codex/references/shotcraft/source/demos/trailer-grammar-moves/TrailerBumper.tsx +103 -0
  271. package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-hidden-cut/InvisibleCut.tsx +93 -0
  272. package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-hidden-cut/LightLeakBurn.tsx +122 -0
  273. package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-hidden-cut/VersusSlam.tsx +104 -0
  274. package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-travel/LetterformZoom.tsx +141 -0
  275. package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-travel/SharedElementMorph.tsx +101 -0
  276. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/LetterformDriftAssembly.tsx +107 -0
  277. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/SplitTextStagger.tsx +101 -0
  278. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/TextOnPath.tsx +92 -0
  279. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/TrackingExpandReveal.tsx +109 -0
  280. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-entrance-moves/LetterDropPhysics.tsx +100 -0
  281. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-entrance-moves/ScrambleDecode.tsx +90 -0
  282. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-rhythm-sync/FontWeightPump.tsx +124 -0
  283. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-rhythm-sync/KaraokeFillSync.tsx +93 -0
  284. package/skills/hyper-animator-codex/references/shotcraft/source/demos/typewriter-moves/TerminalTypewriter.tsx +122 -0
  285. package/skills/hyper-animator-codex/references/shotcraft/source/demos/typewriter-moves/TypewriterErrorRetype.tsx +109 -0
  286. package/skills/hyper-animator-codex/references/shotcraft/source/demos/ui-strip-away-outro/UiStripAwayOutro.tsx +218 -0
  287. package/skills/hyper-animator-codex/references/shotcraft/source/demos/ui-to-brand-morph/IconFlipBloomLogo.tsx +199 -0
  288. package/skills/hyper-animator-codex/references/shotcraft/source/demos/ui-to-brand-morph/InputMorphsIntoLogo.tsx +215 -0
  289. package/skills/hyper-animator-codex/references/shotcraft/source/demos/voice-waveform-live/VoiceWaveformLive.tsx +171 -0
  290. package/skills/hyper-animator-codex/references/shotcraft/source/demos/wall-reveal-moves/BentoLightUp.tsx +135 -0
  291. package/skills/hyper-animator-codex/references/shotcraft/source/demos/wipe-transitions/BlindsSlice.tsx +107 -0
  292. package/skills/hyper-animator-codex/references/shotcraft/source/demos/wipe-transitions/ClockWipe.tsx +83 -0
  293. package/skills/hyper-animator-codex/references/shotcraft/source/demos/word-relay-filmstrip/WordRelayFilmstrip.tsx +300 -0
  294. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/Root.tsx +15 -0
  295. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/Caption.tsx +49 -0
  296. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/DigitRoll.tsx +44 -0
  297. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/FlashCut.tsx +19 -0
  298. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/Main.tsx +163 -0
  299. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/PaperTitleCard.tsx +89 -0
  300. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/PageCam.tsx +145 -0
  301. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneDetail.tsx +146 -0
  302. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneFlyIn.tsx +447 -0
  303. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneOpen.tsx +532 -0
  304. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneOutroLive.tsx +394 -0
  305. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/ScenePapers.tsx +185 -0
  306. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneWbr.tsx +299 -0
  307. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/index.ts +4 -0
  308. package/skills/hyper-animator-codex/references/shotcraft/source-notes.md +10 -0
  309. package/skills/hyper-animator-codex/scripts/generate_minimax_music.mjs +27 -10
  310. package/skills/hyper-animator-codex/scripts/generate_minimax_tts.mjs +142 -13
  311. package/skills/hyper-animator-codex/scripts/generate_subtitles.mjs +42 -3
  312. package/skills/hyper-animator-codex/scripts/minimax_runtime_config.mjs +3 -3
  313. package/skills/hyper-animator-codex/scripts/query_shotcraft.mjs +140 -0
  314. package/skills/hyper-animator-codex/scripts/validate_hyperframes_html.py +22 -0
  315. package/skills/hyper-animator-codex/scripts/validate_provider_policy.mjs +108 -0
  316. package/skills/hyper-animator-codex/scripts/validate_shot_plan.mjs +193 -0
  317. package/skills/hyper-animator-codex/vendor/music-beat-detector/beat_detector/analyzer.py +3 -1
  318. package/skills/hyper-animator-codex/vendor/music-beat-detector/beat_detector/beat.py +37 -1
@@ -0,0 +1,532 @@
1
+ import { AbsoluteFill, Img, interpolate, staticFile, useCurrentFrame, Easing } from 'remotion';
2
+ import { AIFL_SHOTS } from '../Main';
3
+ import { PageCam, CamKey } from './PageCam';
4
+ import layout from '../live-layout.json';
5
+
6
+ const SERIF = 'ui-serif, Georgia, "Times New Roman", serif';
7
+ const MONO = 'ui-monospace, SFMono-Regular, Menlo, monospace';
8
+
9
+ const INK = 'oklch(18% 0.006 82)';
10
+ const AMBER = 'oklch(52% 0.115 65)';
11
+ const INK2 = 'oklch(50% 0.006 82)';
12
+
13
+ const WORDMARK = 'AI Foundation Lab';
14
+ const KICKER = 'TEAM RESEARCH CONSOLE';
15
+
16
+ const PAGE_H = layout.projects.pageH;
17
+
18
+ // --- the ONE hero card the whole opening focuses on -------------------------
19
+ // cards[3] sits in the centre column, mid-grid; its centre x is exactly 960
20
+ // (page centre), so the push-in stays perfectly framed.
21
+ const MAIN = 3;
22
+ const CARD = layout.projects.cards[MAIN];
23
+ const MCX = CARD.x + CARD.w / 2; // ≈ 960
24
+ const MCY = CARD.y + CARD.h / 2; // 772
25
+ const RADIUS = 16;
26
+
27
+ // Camera: straight-on full page (52→84, static while the spotlight roves and
28
+ // locks), then a 16-frame push-in that swings to a LEFT-SIDE view — rotY
29
+ // dominant so the card's left edge reads near and its right edge recedes, with
30
+ // only a slight downward tilt (rotX) — until the single card nearly fills the
31
+ // frame (84→100), then held to the end (190) with an almost-imperceptible pull.
32
+ // The focal page-point sits a touch LEFT of the card centre so the card lands
33
+ // slightly right of screen-centre, foregrounding its near (left) edge.
34
+ const CAM_KEYS: CamKey[] = [
35
+ { frame: 82, cx: 960, cy: 540, zoom: 0.78, rotX: 0, rotY: 0, rotZ: 0, persp: 1200 },
36
+ { frame: 114, cx: 960, cy: 540, zoom: 0.78, rotX: 0, rotY: 0, rotZ: 0, persp: 1200 },
37
+ { frame: 130, cx: MCX - 30, cy: MCY, zoom: 2.6, rotX: 8, rotY: 34, rotZ: 2, persp: 1200 },
38
+ { frame: 220, cx: MCX - 30, cy: MCY, zoom: 2.58, rotX: 8, rotY: 34, rotZ: 2, persp: 1200 },
39
+ ];
40
+ const PUSH_EASE = Easing.bezier(0.35, 0, 0.2, 1);
41
+
42
+ const POP_EASE = Easing.bezier(0.2, 1.25, 0.3, 1); // spring with overshoot
43
+ const RESEAT_EASE = Easing.bezier(0.4, 0, 0.3, 1.05); // compress on touchdown
44
+ const PATCH = 'oklch(97.5% 0.008 82)';
45
+ const SLOT_AMBER = 'oklch(58% 0.13 65)';
46
+ const BEAM_CORE = 'rgba(255,248,232,0.98)';
47
+
48
+ /** Brand open (0–83): an invisible pen draws an amber crosshair, "AI
49
+ * Foundation Lab" letterpresses in glyph by glyph (all glyphs down by ~46), a mono kicker
50
+ * types itself out, then the finished lockup RESTS fully-on for a second
51
+ * (46–76) before dissolving and handing to the console.
52
+ *
53
+ * Single-card macro (82–220): a warm spotlight roves the dashboard, then locks
54
+ * onto ONE card (pool shrinks, surroundings dim); the camera pushes in and
55
+ * SWINGS to a left-side view (rotY-dominant: left edge near, right edge far)
56
+ * until the card nearly fills the frame, a crisp 4x capture crossfading in over
57
+ * the soft page texture; the card springs up off the plane and hovers ~54f
58
+ * while a beam runs two laps around its rounded outline; then it settles flush
59
+ * back into its slot (lock→touchdown ≈ 3.3s). */
60
+ export const SceneOpen: React.FC = () => {
61
+ const frame = useCurrentFrame();
62
+ const duration = AIFL_SHOTS.morning.duration; // 220
63
+
64
+ // --- crosshair draw-on (SVG pathLength = 100) ---
65
+ const vDraw = interpolate(frame, [0, 9], [100, 0], {
66
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.bezier(0.3, 0, 0.2, 1),
67
+ });
68
+ const hDraw = interpolate(frame, [8, 18], [100, 0], {
69
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.linear,
70
+ });
71
+ const crossFade = interpolate(frame, [24, 34], [1, 0], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
72
+
73
+ // --- kicker typewriter (28 -> ~44), 0.7 frames per char ---
74
+ const perChar = 0.7;
75
+ const kickStart = 28;
76
+ const kickChars = Math.floor(Math.max(0, frame - kickStart) / perChar);
77
+ const kickDone = kickStart + KICKER.length * perChar; // ~43.4
78
+ const cursorOn = (() => {
79
+ if (frame < kickStart) return false;
80
+ if (frame < kickDone) return true;
81
+ if (frame > 74) return false; // keep blinking through the 1s rest
82
+ const b = frame - kickDone;
83
+ return Math.floor(b / 2) % 2 === 0;
84
+ })();
85
+
86
+ // --- brand group rests fully-on for ~1s (46 -> 76), then dissolves out
87
+ // (76 -> 83): lift + shrink + fade ---
88
+ const brandOut = interpolate(frame, [76, 83], [0, 1], {
89
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.bezier(0.4, 0, 0.5, 1),
90
+ });
91
+ const brandOpacity = 1 - brandOut;
92
+ const groupY = -brandOut * 40;
93
+ const groupScale = 1 - brandOut * 0.12;
94
+
95
+ // --- macro fades in only after the brand is gone (82 -> 90) ---
96
+ const macroIn = interpolate(frame, [82, 90], [0, 1], {
97
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.bezier(0.3, 0, 0.2, 1),
98
+ });
99
+
100
+ // --- roving spotlight (screen space): three deterministic waypoints across
101
+ // the flat page, then locks onto the hero card centre (which sits at screen
102
+ // (50%, ~67%) in the straight-on view) and rides the push-in to the middle.
103
+ const spotEase = Easing.bezier(0.4, 0, 0.3, 1);
104
+ const spotX = interpolate(frame, [86, 90, 98, 104, 110, 130], [25, 25, 70, 42, 50, 50], {
105
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: spotEase,
106
+ });
107
+ const spotY = interpolate(frame, [86, 90, 98, 104, 110, 130], [30, 30, 45, 60, 67, 50], {
108
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: spotEase,
109
+ });
110
+ const spotOn = interpolate(frame, [84, 92], [0, 1], {
111
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
112
+ });
113
+
114
+ // pool radius: 620 while roving, shrinks to 420 on lock (74→84), then tightens
115
+ // to wrap just the card through the push-in; a small pulse at the lock moment.
116
+ const poolBase = interpolate(frame, [104, 114, 130], [620, 420, 360], {
117
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.bezier(0.4, 0, 0.3, 1),
118
+ });
119
+ const poolPulse = interpolate(frame, [114, 118, 123], [0, 0.06, 0], {
120
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
121
+ });
122
+ const poolRx = poolBase * (1 + poolPulse);
123
+ const poolRy = poolBase * 0.8 * (1 + poolPulse);
124
+ // outside-pool dim deepens as the light locks and the camera pushes in.
125
+ const vignette = interpolate(frame, [104, 114, 130], [0.16, 0.34, 0.42], {
126
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
127
+ });
128
+
129
+ // --- DOF rises through the push-in, then relaxes to zero while the card
130
+ // hovers (the hero is the only subject and the surround is already dim). ---
131
+ const dofStrength = interpolate(frame, [114, 130, 140, 150], [0, 9, 9, 0], {
132
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
133
+ });
134
+
135
+ // --- hero card pop-up ------------------------------------------------------
136
+ // rise 130→140 (spring overshoot), hover 140→194 (54f sin bob), reseat
137
+ // 194→212 (18f, gentle) — lock(114)→touchdown(212) ≈ 98f ≈ 3.3s.
138
+ const rise = interpolate(frame, [130, 140], [0, 1], {
139
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: POP_EASE,
140
+ });
141
+ const reseat = interpolate(frame, [194, 212], [0, 1], {
142
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: RESEAT_EASE,
143
+ });
144
+ const lift = rise * (1 - reseat); // altitude fraction, 0 at rest / reseated
145
+ // slow hover bob over the 54-frame float (period ~40f -> ~1.35 cycles)
146
+ const bob = Math.sin(((frame - 140) / 40) * Math.PI * 2) * 4 * lift;
147
+ const z = 110 * lift + bob;
148
+ const landed = frame >= 212;
149
+
150
+ // press-bounce on touchdown (0.997 → 1 over the last few reseat frames)
151
+ const press = interpolate(frame, [208, 211, 212], [1, 0.997, 1], {
152
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
153
+ });
154
+
155
+ // two-layer shadow that grows with altitude
156
+ const shadow = `0 ${8 * lift}px ${10 + 12 * lift}px rgba(40,30,20,${0.18 * lift}), 0 ${46 * lift}px ${90 * lift}px rgba(40,30,20,${0.22 * lift})`;
157
+
158
+ // vacated-slot amber outline: alive while airborne, brightens as the card
159
+ // lands, then vanishes.
160
+ const slotVis = Math.min(1, rise * 2) * (1 - reseat);
161
+ const landPulse = interpolate(frame, [208, 212, 216], [0, 1, 0], {
162
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
163
+ });
164
+ const slotEdge = Math.min(1, 0.4 * (1 - reseat)) + landPulse * 0.6;
165
+
166
+ // --- perimeter beam: TWO laps around the card outline during the hover.
167
+ // Lap 1 (142→156) runs fast and bright; lap 2 (162→182) runs slower and
168
+ // weaker — two laps read as a sustained scan rather than a single blink. A
169
+ // faint amber ring lingers after lap 2 and fades before reseat (182→194). ---
170
+ const beam1Prog = interpolate(frame, [142, 156], [0, 1], {
171
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.linear,
172
+ });
173
+ const beam1On = frame >= 141 && frame <= 157;
174
+ const beam2Prog = interpolate(frame, [162, 182], [0, 1], {
175
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.bezier(0.4, 0, 0.4, 1),
176
+ });
177
+ const beam2On = frame >= 161 && frame <= 183;
178
+ const beamTrail = interpolate(frame, [182, 194], [0.35, 0], {
179
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
180
+ });
181
+ const bw = CARD.w + 6;
182
+ const bh = CARD.h + 6;
183
+
184
+ // --- hi-res hero: a 4x element capture crossfades in as the push-in starts
185
+ // (84→90), covering the soft 2x page texture underneath. It stays on top for
186
+ // the pop-up / hover / reseat so the enlarged card reads crisp. ---
187
+ const hiresIn = interpolate(frame, [114, 120], [0, 1], {
188
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
189
+ });
190
+
191
+ // --- whole scene dissolves to paper just before the cut -> title card 1 ---
192
+ const outT = interpolate(frame, [duration - 5, duration], [0, 1], {
193
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.bezier(0.5, 0, 0.6, 1),
194
+ });
195
+ const rootOpacity = 1 - outT;
196
+
197
+ return (
198
+ <AbsoluteFill style={{ backgroundColor: '#faf7f2', opacity: rootOpacity }}>
199
+ {frame >= 84 ? (
200
+ <AbsoluteFill style={{ opacity: macroIn }}>
201
+ <PageCam
202
+ src="textures/live/projects-full.png"
203
+ pageH={PAGE_H}
204
+ keys={CAM_KEYS}
205
+ ease={PUSH_EASE}
206
+ dof={{ focusY: 240, strength: dofStrength }}
207
+ >
208
+ {/* rim light along the near (bottom) edge of the tilted plane */}
209
+ <div
210
+ style={{
211
+ position: 'absolute', left: 0, right: 0, bottom: 0, height: 8,
212
+ background: 'rgba(255,255,255,0.85)', filter: 'blur(6px)',
213
+ opacity: 0.6 * Math.min(1, lift + Math.max(0, (frame - 114) / 16)),
214
+ pointerEvents: 'none',
215
+ }}
216
+ />
217
+
218
+ {/* hero card: lifts off its slot, hovers, beam runs, settles back */}
219
+ <div style={{ transformStyle: 'preserve-3d' }}>
220
+ {/* vacated-slot patch + breathing amber outline (only when up) */}
221
+ {slotVis > 0.02 ? (
222
+ <div
223
+ style={{
224
+ position: 'absolute', left: CARD.x - 2, top: CARD.y - 2,
225
+ width: CARD.w + 4, height: CARD.h + 4, background: PATCH,
226
+ borderRadius: RADIUS,
227
+ boxShadow: `inset 0 0 26px rgba(180,120,50,${0.12 * slotEdge})`,
228
+ opacity: slotVis,
229
+ }}
230
+ >
231
+ <div
232
+ style={{
233
+ position: 'absolute', inset: 0, borderRadius: RADIUS,
234
+ border: `1.5px solid ${SLOT_AMBER}`, opacity: slotEdge,
235
+ pointerEvents: 'none',
236
+ }}
237
+ />
238
+ </div>
239
+ ) : null}
240
+
241
+ {/* the levitating card */}
242
+ <div
243
+ style={{
244
+ position: 'absolute', left: CARD.x, top: CARD.y,
245
+ width: CARD.w, height: CARD.h,
246
+ transform: `translateZ(${z}px) scale(${press})`,
247
+ transformOrigin: 'center center',
248
+ transformStyle: 'preserve-3d',
249
+ }}
250
+ >
251
+ {/* card body (clipped) + top-light gradient */}
252
+ <div
253
+ style={{
254
+ position: 'absolute', inset: 0, borderRadius: RADIUS,
255
+ overflow: 'hidden',
256
+ boxShadow: landed ? 'none' : shadow,
257
+ }}
258
+ >
259
+ <Img
260
+ src={staticFile(`textures/live/${CARD.file}`)}
261
+ style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', display: 'block' }}
262
+ />
263
+ {/* 4x hi-res capture layered on top, laid out at plain CARD
264
+ size. Because PageCam now applies the push-in magnification
265
+ as a LAYOUT-scale CSS `zoom` (not a transform scale), this
266
+ image rasterizes at its enlarged device size (~CARD.w*zoom
267
+ px) and samples DOWN from the 1432px source — crisp — rather
268
+ than being downsampled to layout size and GPU-upscaled. */}
269
+ <Img
270
+ src={staticFile('textures/live/card4-hires.png')}
271
+ style={{
272
+ position: 'absolute',
273
+ inset: 0,
274
+ width: '100%',
275
+ height: '100%',
276
+ display: 'block',
277
+ opacity: hiresIn,
278
+ }}
279
+ />
280
+ {/* top-light sheen, like a card lit from above by the spot */}
281
+ <div
282
+ style={{
283
+ position: 'absolute', inset: 0,
284
+ background: 'linear-gradient(160deg, rgba(255,255,255,0.5), transparent 40%)',
285
+ opacity: lift, pointerEvents: 'none',
286
+ }}
287
+ />
288
+ </div>
289
+ {/* 1px white inner stroke (lit paper edge) */}
290
+ <div
291
+ style={{
292
+ position: 'absolute', inset: 0, borderRadius: RADIUS,
293
+ boxShadow: `inset 0 0 0 1px rgba(255,255,255,${0.7 * lift})`,
294
+ pointerEvents: 'none',
295
+ }}
296
+ />
297
+
298
+ {/* perimeter beam: SVG rounded-rect, pathLength=1 travelling arc.
299
+ Lap 1 (fast, bright) then lap 2 (slow, weaker). */}
300
+ {(beam1On || beam2On) && lift > 0.4 ? (
301
+ <svg
302
+ width={bw}
303
+ height={bh}
304
+ viewBox={`0 0 ${bw} ${bh}`}
305
+ style={{
306
+ position: 'absolute', left: -3, top: -3, overflow: 'visible',
307
+ pointerEvents: 'none',
308
+ opacity: beam1On ? 1 : 0.62,
309
+ filter: `drop-shadow(0 0 6px ${AMBER}) drop-shadow(0 0 18px rgba(255,240,210,0.55))`,
310
+ }}
311
+ >
312
+ {/* amber edge (wider) */}
313
+ <rect
314
+ x={2} y={2} width={bw - 4} height={bh - 4} rx={RADIUS} fill="none"
315
+ stroke={AMBER} strokeWidth={beam1On ? 5 : 3.5} strokeLinecap="round"
316
+ pathLength={1} strokeDasharray="0.14 1" strokeDashoffset={-(beam1On ? beam1Prog : beam2Prog)}
317
+ />
318
+ {/* warm-white core (narrower) */}
319
+ <rect
320
+ x={2} y={2} width={bw - 4} height={bh - 4} rx={RADIUS} fill="none"
321
+ stroke={BEAM_CORE} strokeWidth={beam1On ? 2.5 : 1.75} strokeLinecap="round"
322
+ pathLength={1} strokeDasharray="0.14 1" strokeDashoffset={-(beam1On ? beam1Prog : beam2Prog)}
323
+ />
324
+ </svg>
325
+ ) : null}
326
+
327
+ {/* faint amber ring left behind, fades out */}
328
+ {beamTrail > 0.01 ? (
329
+ <div
330
+ style={{
331
+ position: 'absolute', inset: -3, borderRadius: RADIUS + 3,
332
+ border: `1.5px solid ${AMBER}`, opacity: beamTrail,
333
+ pointerEvents: 'none',
334
+ }}
335
+ />
336
+ ) : null}
337
+ </div>
338
+ </div>
339
+
340
+ {/* 3D floating annotation LEFT of the hovering card: big serif note
341
+ lifted off the page plane (translateZ), seen through the same
342
+ oblique camera; a marker highlight sweeps under the key words. */}
343
+ {frame >= 142 && frame <= 212 ? (() => {
344
+ const noteIn = interpolate(frame, [142, 152], [0, 1], {
345
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.bezier(0.2, 0.75, 0.3, 1),
346
+ });
347
+ const noteOut = interpolate(frame, [198, 208], [1, 0], {
348
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
349
+ });
350
+ const noteVis = noteIn * noteOut;
351
+ // gentle bob in sympathy with the card's hover
352
+ const noteZ = 92 + Math.sin(((frame - 142) / 44) * Math.PI * 2) * 3;
353
+ const hl = interpolate(frame, [156, 168], [0, 1], {
354
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.bezier(0.3, 0, 0.2, 1),
355
+ });
356
+ return (
357
+ <div style={{ transformStyle: 'preserve-3d', pointerEvents: 'none' }}>
358
+ {/* soft shadow the note casts onto the page */}
359
+ <div
360
+ style={{
361
+ position: 'absolute', left: 566, top: 736, width: 210, height: 74,
362
+ transform: 'translateZ(2px)',
363
+ background: 'radial-gradient(ellipse at 50% 50%, rgba(40,30,20,0.3), transparent 70%)',
364
+ filter: 'blur(12px)',
365
+ opacity: 0.55 * noteVis,
366
+ }}
367
+ />
368
+ <div
369
+ style={{
370
+ position: 'absolute', left: 556, top: 668, width: 230,
371
+ transform: `translateZ(${noteZ}px) translateY(${(1 - noteIn) * 26}px)`,
372
+ opacity: noteVis,
373
+ filter: `blur(${(1 - noteIn) * 4}px)`,
374
+ }}
375
+ >
376
+ <div
377
+ style={{
378
+ fontFamily: SERIF, fontSize: 37, fontWeight: 600, color: INK,
379
+ lineHeight: 1.16, letterSpacing: '-0.012em',
380
+ }}
381
+ >
382
+ One card,
383
+ </div>
384
+ <div style={{ position: 'relative', display: 'inline-block' }}>
385
+ {/* marker highlight sweeping in behind the words */}
386
+ <div
387
+ style={{
388
+ position: 'absolute', left: -5, top: '12%', bottom: '4%',
389
+ width: `calc(${hl} * (100% + 10px))`,
390
+ background: 'oklch(88% 0.095 85)',
391
+ borderRadius: 4,
392
+ }}
393
+ />
394
+ <div
395
+ style={{
396
+ position: 'relative',
397
+ fontFamily: SERIF, fontStyle: 'italic', fontSize: 37, fontWeight: 600,
398
+ color: INK, lineHeight: 1.16, letterSpacing: '-0.012em',
399
+ }}
400
+ >
401
+ one project.
402
+ </div>
403
+ </div>
404
+ </div>
405
+ </div>
406
+ );
407
+ })() : null}
408
+ </PageCam>
409
+
410
+ {/* roving / locking spotlight: warm pool + dim outside so it reads */}
411
+ <AbsoluteFill
412
+ style={{
413
+ background: `radial-gradient(${poolRx}px ${poolRy}px at ${spotX}% ${spotY}%, rgba(255,241,214,0.42), rgba(255,241,214,0.10) 45%, rgba(70,56,38,${vignette * spotOn}) 100%)`,
414
+ pointerEvents: 'none',
415
+ opacity: spotOn,
416
+ }}
417
+ />
418
+ {/* faint trailing bounce of the same light */}
419
+ <AbsoluteFill
420
+ style={{
421
+ background: `radial-gradient(300px 220px at ${spotX - 6}% ${spotY + 10}%, rgba(255,246,228,0.18), transparent 70%)`,
422
+ pointerEvents: 'none',
423
+ opacity: spotOn * 0.7,
424
+ }}
425
+ />
426
+ </AbsoluteFill>
427
+ ) : null}
428
+
429
+ {/* brand group: crosshair + wordmark + kicker, dissolves out by frame 53 */}
430
+ {brandOpacity > 0 ? (
431
+ <AbsoluteFill style={{ justifyContent: 'center', alignItems: 'center', pointerEvents: 'none', opacity: brandOpacity }}>
432
+ <div
433
+ style={{
434
+ textAlign: 'center',
435
+ transform: `translateY(${groupY}px) scale(${groupScale})`,
436
+ transformOrigin: 'center center',
437
+ }}
438
+ >
439
+ {/* crosshair drawn by an invisible amber pen */}
440
+ <svg
441
+ width={64}
442
+ height={64}
443
+ viewBox="0 0 64 64"
444
+ style={{ display: 'block', margin: '0 auto 34px', opacity: crossFade }}
445
+ >
446
+ <line
447
+ x1={32} y1={2} x2={32} y2={62}
448
+ stroke={AMBER} strokeWidth={5} strokeLinecap="round"
449
+ pathLength={100} strokeDasharray={100} strokeDashoffset={vDraw}
450
+ />
451
+ <line
452
+ x1={2} y1={32} x2={62} y2={32}
453
+ stroke={AMBER} strokeWidth={5} strokeLinecap="round"
454
+ pathLength={100} strokeDasharray={100} strokeDashoffset={hDraw}
455
+ />
456
+ </svg>
457
+
458
+ {/* wordmark: glyph-by-glyph letterpress with amber under-glint */}
459
+ <div
460
+ style={{
461
+ fontFamily: SERIF, fontSize: 132, fontWeight: 600, color: INK,
462
+ letterSpacing: '-0.01em', lineHeight: 1, whiteSpace: 'pre',
463
+ display: 'inline-flex', alignItems: 'flex-end',
464
+ }}
465
+ >
466
+ {WORDMARK.split('').map((ch, i) => {
467
+ const delay = 10 + i * 3;
468
+ const t = interpolate(frame, [delay, delay + 12], [0, 1], {
469
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
470
+ easing: Easing.bezier(0.2, 0.7, 0.25, 1),
471
+ });
472
+ const glintCenter = delay + 12;
473
+ const glint = interpolate(frame, [glintCenter - 4, glintCenter, glintCenter + 4], [0, 1, 0], {
474
+ extrapolateLeft: 'clamp', extrapolateRight: 'clamp',
475
+ });
476
+ return (
477
+ <span
478
+ key={i}
479
+ style={{
480
+ position: 'relative',
481
+ display: 'inline-block',
482
+ opacity: t,
483
+ transform: `scale(${1.6 - 0.6 * t})`,
484
+ transformOrigin: 'center bottom',
485
+ filter: `blur(${(1 - t) * 6}px)`,
486
+ }}
487
+ >
488
+ {ch === ' ' ? ' ' : ch}
489
+ <span
490
+ style={{
491
+ position: 'absolute',
492
+ left: '50%',
493
+ bottom: -6,
494
+ transform: 'translateX(-50%)',
495
+ width: `${glint * 100}%`,
496
+ height: 2,
497
+ background: AMBER,
498
+ opacity: glint,
499
+ borderRadius: 2,
500
+ }}
501
+ />
502
+ </span>
503
+ );
504
+ })}
505
+ </div>
506
+
507
+ {/* mono kicker typewriter + amber block cursor */}
508
+ <div
509
+ style={{
510
+ fontFamily: MONO, fontSize: 26, letterSpacing: '0.14em', color: INK2,
511
+ marginTop: 30, textTransform: 'uppercase', height: 30,
512
+ display: 'flex', justifyContent: 'center', alignItems: 'center',
513
+ }}
514
+ >
515
+ <span style={{ whiteSpace: 'pre' }}>{KICKER.slice(0, kickChars)}</span>
516
+ <span
517
+ style={{
518
+ display: 'inline-block',
519
+ width: 14,
520
+ height: 24,
521
+ marginLeft: 4,
522
+ background: AMBER,
523
+ opacity: cursorOn ? 0.85 : 0,
524
+ }}
525
+ />
526
+ </div>
527
+ </div>
528
+ </AbsoluteFill>
529
+ ) : null}
530
+ </AbsoluteFill>
531
+ );
532
+ };