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.
Files changed (321) hide show
  1. package/README.md +67 -7
  2. package/bin/hyper-animator-codex.mjs +31 -9
  3. package/bin/postinstall.mjs +19 -0
  4. package/lib/install-options.mjs +3 -0
  5. package/lib/install-skill.mjs +84 -2
  6. package/lib/minimax-config.mjs +3 -3
  7. package/package.json +3 -2
  8. package/skills/hyper-animator-codex/SKILL.md +58 -20
  9. package/skills/hyper-animator-codex/agents/openai.yaml +2 -2
  10. package/skills/hyper-animator-codex/contracts/shot-plan.schema.json +214 -0
  11. package/skills/hyper-animator-codex/contracts/workflow-policy.json +85 -0
  12. package/skills/hyper-animator-codex/references/HyperFrames-AI-Generation-Patterns-codex.md +788 -0
  13. package/skills/hyper-animator-codex/references/beat-sync-workflow.md +7 -0
  14. package/skills/hyper-animator-codex/references/examples/shot-plan-dual-catalog.json +69 -0
  15. package/skills/hyper-animator-codex/references/hyperframes-agent-pseudocode.ts +1 -1
  16. package/skills/hyper-animator-codex/references/hyperframes-catalog-map.json +97 -230
  17. package/skills/hyper-animator-codex/references/hyperframes-intent-workflow.md +23 -7
  18. package/skills/hyper-animator-codex/references/minimax-music-workflow.md +24 -4
  19. package/skills/hyper-animator-codex/references/narration-audio-workflow.md +31 -1
  20. package/skills/hyper-animator-codex/references/shotcraft/LICENSE +202 -0
  21. package/skills/hyper-animator-codex/references/shotcraft/cards/ai-stream-response/README.md +46 -0
  22. package/skills/hyper-animator-codex/references/shotcraft/cards/autolayout-gap-dial/README.md +53 -0
  23. package/skills/hyper-animator-codex/references/shotcraft/cards/beat-cut-moves/README.md +54 -0
  24. package/skills/hyper-animator-codex/references/shotcraft/cards/beat-step-list-theme-cycle/README.md +59 -0
  25. package/skills/hyper-animator-codex/references/shotcraft/cards/before-after-slider-scrub/README.md +47 -0
  26. package/skills/hyper-animator-codex/references/shotcraft/cards/bottom-push-stack-wipe/README.md +58 -0
  27. package/skills/hyper-animator-codex/references/shotcraft/cards/brand-frame-snap/README.md +51 -0
  28. package/skills/hyper-animator-codex/references/shotcraft/cards/brand-ink-open/README.md +35 -0
  29. package/skills/hyper-animator-codex/references/shotcraft/cards/bubble-swarm-takeover/README.md +62 -0
  30. package/skills/hyper-animator-codex/references/shotcraft/cards/canvas-materialize-moves/README.md +55 -0
  31. package/skills/hyper-animator-codex/references/shotcraft/cards/card-flip-reveal/README.md +50 -0
  32. package/skills/hyper-animator-codex/references/shotcraft/cards/card-flock-tumble/README.md +54 -0
  33. package/skills/hyper-animator-codex/references/shotcraft/cards/cel-flash-stomp/README.md +54 -0
  34. package/skills/hyper-animator-codex/references/shotcraft/cards/chart-live-moves/README.md +51 -0
  35. package/skills/hyper-animator-codex/references/shotcraft/cards/circle-match-iris/README.md +53 -0
  36. package/skills/hyper-animator-codex/references/shotcraft/cards/cloner-depth-echo/README.md +38 -0
  37. package/skills/hyper-animator-codex/references/shotcraft/cards/collab-cursor-moves/README.md +48 -0
  38. package/skills/hyper-animator-codex/references/shotcraft/cards/color-block-step-wipe/README.md +54 -0
  39. package/skills/hyper-animator-codex/references/shotcraft/cards/command-palette-summon/README.md +45 -0
  40. package/skills/hyper-animator-codex/references/shotcraft/cards/crane-rise-reveal/README.md +47 -0
  41. package/skills/hyper-animator-codex/references/shotcraft/cards/crash-zoom-punch/README.md +38 -0
  42. package/skills/hyper-animator-codex/references/shotcraft/cards/dataviz-landscape-open/README.md +54 -0
  43. package/skills/hyper-animator-codex/references/shotcraft/cards/deck-deal-flyin/README.md +45 -0
  44. package/skills/hyper-animator-codex/references/shotcraft/cards/depth-layer-moves/README.md +40 -0
  45. package/skills/hyper-animator-codex/references/shotcraft/cards/document-typewriter-reveal/README.md +40 -0
  46. package/skills/hyper-animator-codex/references/shotcraft/cards/draw-svg-trace/README.md +50 -0
  47. package/skills/hyper-animator-codex/references/shotcraft/cards/edit-hook-moves/README.md +38 -0
  48. package/skills/hyper-animator-codex/references/shotcraft/cards/element-body-moves/README.md +49 -0
  49. package/skills/hyper-animator-codex/references/shotcraft/cards/fui-hud-moves/README.md +44 -0
  50. package/skills/hyper-animator-codex/references/shotcraft/cards/gauge-readout-moves/README.md +45 -0
  51. package/skills/hyper-animator-codex/references/shotcraft/cards/glow-flyline-moves/README.md +51 -0
  52. package/skills/hyper-animator-codex/references/shotcraft/cards/gradient-word-sweep/README.md +49 -0
  53. package/skills/hyper-animator-codex/references/shotcraft/cards/graze-face-tour/README.md +56 -0
  54. package/skills/hyper-animator-codex/references/shotcraft/cards/hashtag-to-pill-materialize/README.md +57 -0
  55. package/skills/hyper-animator-codex/references/shotcraft/cards/hires-rasterize-3d-text/README.md +34 -0
  56. package/skills/hyper-animator-codex/references/shotcraft/cards/icon-field-colorize/README.md +53 -0
  57. package/skills/hyper-animator-codex/references/shotcraft/cards/icon-performance-moves/README.md +46 -0
  58. package/skills/hyper-animator-codex/references/shotcraft/cards/impact-feedback/README.md +50 -0
  59. package/skills/hyper-animator-codex/references/shotcraft/cards/input-trigger-moves/README.md +49 -0
  60. package/skills/hyper-animator-codex/references/shotcraft/cards/integration-hub-map/README.md +54 -0
  61. package/skills/hyper-animator-codex/references/shotcraft/cards/letterspace-materialize/README.md +52 -0
  62. package/skills/hyper-animator-codex/references/shotcraft/cards/light-play-moves/README.md +49 -0
  63. package/skills/hyper-animator-codex/references/shotcraft/cards/line-boil/README.md +52 -0
  64. package/skills/hyper-animator-codex/references/shotcraft/cards/line-carry-transition/README.md +52 -0
  65. package/skills/hyper-animator-codex/references/shotcraft/cards/list-stack-press/README.md +43 -0
  66. package/skills/hyper-animator-codex/references/shotcraft/cards/magician-card-flourish/README.md +63 -0
  67. package/skills/hyper-animator-codex/references/shotcraft/cards/marker-underline-title/README.md +48 -0
  68. package/skills/hyper-animator-codex/references/shotcraft/cards/montage-rhythm-moves/README.md +55 -0
  69. package/skills/hyper-animator-codex/references/shotcraft/cards/morph-from-primitive/README.md +51 -0
  70. package/skills/hyper-animator-codex/references/shotcraft/cards/neon-frame-forerun/README.md +50 -0
  71. package/skills/hyper-animator-codex/references/shotcraft/cards/neon-frame-orbit-drop/README.md +50 -0
  72. package/skills/hyper-animator-codex/references/shotcraft/cards/neon-triple-marquee/README.md +55 -0
  73. package/skills/hyper-animator-codex/references/shotcraft/cards/odometer-digit-roll/README.md +54 -0
  74. package/skills/hyper-animator-codex/references/shotcraft/cards/outro-group-photo-launch/README.md +39 -0
  75. package/skills/hyper-animator-codex/references/shotcraft/cards/overhead-camera-moves/README.md +50 -0
  76. package/skills/hyper-animator-codex/references/shotcraft/cards/page-turn-transitions/README.md +48 -0
  77. package/skills/hyper-animator-codex/references/shotcraft/cards/page-waterfall-wall/README.md +52 -0
  78. package/skills/hyper-animator-codex/references/shotcraft/cards/panel-grid-moves/README.md +52 -0
  79. package/skills/hyper-animator-codex/references/shotcraft/cards/paper-craft-moves/README.md +46 -0
  80. package/skills/hyper-animator-codex/references/shotcraft/cards/paper-plane-messenger/README.md +62 -0
  81. package/skills/hyper-animator-codex/references/shotcraft/cards/paper-title-card/README.md +36 -0
  82. package/skills/hyper-animator-codex/references/shotcraft/cards/particle-celebrate-hits/README.md +42 -0
  83. package/skills/hyper-animator-codex/references/shotcraft/cards/particle-sand-fill/README.md +39 -0
  84. package/skills/hyper-animator-codex/references/shotcraft/cards/pill-slot-cycle/README.md +57 -0
  85. package/skills/hyper-animator-codex/references/shotcraft/cards/print-texture-transitions/README.md +40 -0
  86. package/skills/hyper-animator-codex/references/shotcraft/cards/rhythm-interrupt-moves/README.md +44 -0
  87. package/skills/hyper-animator-codex/references/shotcraft/cards/riso-print-hits/README.md +54 -0
  88. package/skills/hyper-animator-codex/references/shotcraft/cards/row-embed/README.md +36 -0
  89. package/skills/hyper-animator-codex/references/shotcraft/cards/runway-ground-skim/README.md +52 -0
  90. package/skills/hyper-animator-codex/references/shotcraft/cards/sakuga-timing-shift/README.md +50 -0
  91. package/skills/hyper-animator-codex/references/shotcraft/cards/scene-locked-title/README.md +43 -0
  92. package/skills/hyper-animator-codex/references/shotcraft/cards/scroll-brake-moves/README.md +45 -0
  93. package/skills/hyper-animator-codex/references/shotcraft/cards/segmented-thumb-hero/README.md +57 -0
  94. package/skills/hyper-animator-codex/references/shotcraft/cards/shot-transitions/README.md +60 -0
  95. package/skills/hyper-animator-codex/references/shotcraft/cards/skeleton-reveal/README.md +54 -0
  96. package/skills/hyper-animator-codex/references/shotcraft/cards/slam-entrance-moves/README.md +53 -0
  97. package/skills/hyper-animator-codex/references/shotcraft/cards/smear-multiples/README.md +49 -0
  98. package/skills/hyper-animator-codex/references/shotcraft/cards/space-camera-moves/README.md +53 -0
  99. package/skills/hyper-animator-codex/references/shotcraft/cards/spectrum-morph-ui/README.md +50 -0
  100. package/skills/hyper-animator-codex/references/shotcraft/cards/speed-ramp-freeze/README.md +42 -0
  101. package/skills/hyper-animator-codex/references/shotcraft/cards/split-flap-title/README.md +52 -0
  102. package/skills/hyper-animator-codex/references/shotcraft/cards/spotlight-hero-card/README.md +39 -0
  103. package/skills/hyper-animator-codex/references/shotcraft/cards/spotlight-sweep-moves/README.md +51 -0
  104. package/skills/hyper-animator-codex/references/shotcraft/cards/steep-tilt-glide/README.md +53 -0
  105. package/skills/hyper-animator-codex/references/shotcraft/cards/stroke-segment-build/README.md +43 -0
  106. package/skills/hyper-animator-codex/references/shotcraft/cards/tear-streak-transitions/README.md +43 -0
  107. package/skills/hyper-animator-codex/references/shotcraft/cards/tension-camera-moves/README.md +55 -0
  108. package/skills/hyper-animator-codex/references/shotcraft/cards/text-as-mask/README.md +50 -0
  109. package/skills/hyper-animator-codex/references/shotcraft/cards/text-column-converge/README.md +55 -0
  110. package/skills/hyper-animator-codex/references/shotcraft/cards/theme-switch-moves/README.md +44 -0
  111. package/skills/hyper-animator-codex/references/shotcraft/cards/timeline-travel/README.md +43 -0
  112. package/skills/hyper-animator-codex/references/shotcraft/cards/title-demote-to-label/README.md +58 -0
  113. package/skills/hyper-animator-codex/references/shotcraft/cards/trailer-grammar-moves/README.md +51 -0
  114. package/skills/hyper-animator-codex/references/shotcraft/cards/transition-hidden-cut/README.md +52 -0
  115. package/skills/hyper-animator-codex/references/shotcraft/cards/transition-travel/README.md +48 -0
  116. package/skills/hyper-animator-codex/references/shotcraft/cards/type-and-filter/README.md +37 -0
  117. package/skills/hyper-animator-codex/references/shotcraft/cards/type-assembly-moves/README.md +50 -0
  118. package/skills/hyper-animator-codex/references/shotcraft/cards/type-entrance-moves/README.md +46 -0
  119. package/skills/hyper-animator-codex/references/shotcraft/cards/type-rhythm-sync/README.md +47 -0
  120. package/skills/hyper-animator-codex/references/shotcraft/cards/typewriter-moves/README.md +50 -0
  121. package/skills/hyper-animator-codex/references/shotcraft/cards/ui-strip-away-outro/README.md +63 -0
  122. package/skills/hyper-animator-codex/references/shotcraft/cards/ui-to-brand-morph/README.md +52 -0
  123. package/skills/hyper-animator-codex/references/shotcraft/cards/voice-waveform-live/README.md +52 -0
  124. package/skills/hyper-animator-codex/references/shotcraft/cards/wall-reveal-moves/README.md +53 -0
  125. package/skills/hyper-animator-codex/references/shotcraft/cards/wipe-transitions/README.md +47 -0
  126. package/skills/hyper-animator-codex/references/shotcraft/cards/word-relay-filmstrip/README.md +50 -0
  127. package/skills/hyper-animator-codex/references/shotcraft/catalog.json +3946 -0
  128. package/skills/hyper-animator-codex/references/shotcraft/references/aesthetic-rules.md +157 -0
  129. package/skills/hyper-animator-codex/references/shotcraft/references/final-review.md +107 -0
  130. package/skills/hyper-animator-codex/references/shotcraft/references/guided-free-creation.md +197 -0
  131. package/skills/hyper-animator-codex/references/shotcraft/references/music-beat-sync.md +125 -0
  132. package/skills/hyper-animator-codex/references/shotcraft/references/pipeline.md +357 -0
  133. package/skills/hyper-animator-codex/references/shotcraft/references/sound-design.md +126 -0
  134. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/Caption.tsx +50 -0
  135. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/DigitRoll.tsx +45 -0
  136. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/FlashCut.tsx +20 -0
  137. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/FlatPanel.tsx +65 -0
  138. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/PageCam.tsx +151 -0
  139. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/VerticalTicker.tsx +129 -0
  140. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/camera.tsx +75 -0
  141. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/motion.ts +40 -0
  142. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/rand.ts +11 -0
  143. package/skills/hyper-animator-codex/references/shotcraft/source/assets/lib/helpers/shake.ts +10 -0
  144. package/skills/hyper-animator-codex/references/shotcraft/source/demos/_fixtures/Fixtures.tsx +83 -0
  145. package/skills/hyper-animator-codex/references/shotcraft/source/demos/ai-stream-response/StreamResponse.tsx +146 -0
  146. package/skills/hyper-animator-codex/references/shotcraft/source/demos/autolayout-gap-dial/AutolayoutGapDial.tsx +174 -0
  147. package/skills/hyper-animator-codex/references/shotcraft/source/demos/beat-cut-moves/BeatCutAccelerando.tsx +77 -0
  148. package/skills/hyper-animator-codex/references/shotcraft/source/demos/beat-cut-moves/PaparazziFlash.tsx +115 -0
  149. package/skills/hyper-animator-codex/references/shotcraft/source/demos/beat-step-list-theme-cycle/BeatStepListThemeCycle.tsx +98 -0
  150. package/skills/hyper-animator-codex/references/shotcraft/source/demos/before-after-slider-scrub/BeforeAfterSliderScrub.tsx +99 -0
  151. package/skills/hyper-animator-codex/references/shotcraft/source/demos/bottom-push-stack-wipe/BottomPushStackWipe.tsx +79 -0
  152. package/skills/hyper-animator-codex/references/shotcraft/source/demos/brand-frame-snap/BrandFrameSnap.tsx +110 -0
  153. package/skills/hyper-animator-codex/references/shotcraft/source/demos/bubble-swarm-takeover/BubbleSwarmTakeover.tsx +189 -0
  154. package/skills/hyper-animator-codex/references/shotcraft/source/demos/canvas-materialize-moves/DiagramCascadeBuild.tsx +172 -0
  155. package/skills/hyper-animator-codex/references/shotcraft/source/demos/canvas-materialize-moves/PanelToCanvasMaterialize.tsx +254 -0
  156. package/skills/hyper-animator-codex/references/shotcraft/source/demos/card-flip-reveal/CardFlipReveal.tsx +139 -0
  157. package/skills/hyper-animator-codex/references/shotcraft/source/demos/card-flock-tumble/CardFlockTumble.tsx +382 -0
  158. package/skills/hyper-animator-codex/references/shotcraft/source/demos/cel-flash-stomp/CelFlashStomp.tsx +111 -0
  159. package/skills/hyper-animator-codex/references/shotcraft/source/demos/chart-live-moves/AxisRescaleShockV2.tsx +282 -0
  160. package/skills/hyper-animator-codex/references/shotcraft/source/demos/chart-live-moves/OscilloscopeStreamV2.tsx +227 -0
  161. package/skills/hyper-animator-codex/references/shotcraft/source/demos/chart-live-moves/UnitDotSwarmRegroupV2.tsx +248 -0
  162. package/skills/hyper-animator-codex/references/shotcraft/source/demos/circle-match-iris/CircleMatchIris.tsx +124 -0
  163. package/skills/hyper-animator-codex/references/shotcraft/source/demos/cloner-depth-echo/ClonerDepthEcho.tsx +90 -0
  164. package/skills/hyper-animator-codex/references/shotcraft/source/demos/collab-cursor-moves/CursorCastEnsemble.tsx +136 -0
  165. package/skills/hyper-animator-codex/references/shotcraft/source/demos/collab-cursor-moves/CursorDialogueDuet.tsx +145 -0
  166. package/skills/hyper-animator-codex/references/shotcraft/source/demos/color-block-step-wipe/ColorBlockStepWipe.tsx +157 -0
  167. package/skills/hyper-animator-codex/references/shotcraft/source/demos/command-palette-summon/CommandPaletteSummon.tsx +173 -0
  168. package/skills/hyper-animator-codex/references/shotcraft/source/demos/crane-rise-reveal/CraneRiseReveal.tsx +91 -0
  169. package/skills/hyper-animator-codex/references/shotcraft/source/demos/crash-zoom-punch/CrashImpactReal.tsx +63 -0
  170. package/skills/hyper-animator-codex/references/shotcraft/source/demos/crash-zoom-punch/CrashZoomReal.tsx +60 -0
  171. package/skills/hyper-animator-codex/references/shotcraft/source/demos/dataviz-landscape-open/DatavizLandscapeOpen.tsx +401 -0
  172. package/skills/hyper-animator-codex/references/shotcraft/source/demos/depth-layer-moves/DollyZoomReal.tsx +55 -0
  173. package/skills/hyper-animator-codex/references/shotcraft/source/demos/depth-layer-moves/MultiplaneReal.tsx +45 -0
  174. package/skills/hyper-animator-codex/references/shotcraft/source/demos/draw-svg-trace/DrawSvgTrace.tsx +199 -0
  175. package/skills/hyper-animator-codex/references/shotcraft/source/demos/edit-hook-moves/LogoStingButton.tsx +106 -0
  176. package/skills/hyper-animator-codex/references/shotcraft/source/demos/element-body-moves/AxialStretch.tsx +112 -0
  177. package/skills/hyper-animator-codex/references/shotcraft/source/demos/element-body-moves/ContactShadowLift.tsx +117 -0
  178. package/skills/hyper-animator-codex/references/shotcraft/source/demos/fui-hud-moves/LineUnfoldPanel.tsx +125 -0
  179. package/skills/hyper-animator-codex/references/shotcraft/source/demos/fui-hud-moves/ReticleLockOn.tsx +139 -0
  180. package/skills/hyper-animator-codex/references/shotcraft/source/demos/gauge-readout-moves/NeedleSweepSelftest.tsx +146 -0
  181. package/skills/hyper-animator-codex/references/shotcraft/source/demos/gauge-readout-moves/TapeScrollFixedPointer.tsx +120 -0
  182. package/skills/hyper-animator-codex/references/shotcraft/source/demos/glow-flyline-moves/FlylineArc.tsx +158 -0
  183. package/skills/hyper-animator-codex/references/shotcraft/source/demos/glow-flyline-moves/GlowOrbAmbient.tsx +131 -0
  184. package/skills/hyper-animator-codex/references/shotcraft/source/demos/glow-flyline-moves/OrbFlylineRelay.tsx +268 -0
  185. package/skills/hyper-animator-codex/references/shotcraft/source/demos/gradient-word-sweep/GradientWordSweep.tsx +307 -0
  186. package/skills/hyper-animator-codex/references/shotcraft/source/demos/graze-face-tour/GrazeFaceTour.tsx +469 -0
  187. package/skills/hyper-animator-codex/references/shotcraft/source/demos/hashtag-to-pill-materialize/HashtagToPillMaterialize.tsx +166 -0
  188. package/skills/hyper-animator-codex/references/shotcraft/source/demos/icon-field-colorize/IconFieldColorize.tsx +93 -0
  189. package/skills/hyper-animator-codex/references/shotcraft/source/demos/icon-performance-moves/AttentionBounce.tsx +193 -0
  190. package/skills/hyper-animator-codex/references/shotcraft/source/demos/icon-performance-moves/PopBurstConfirm.tsx +162 -0
  191. package/skills/hyper-animator-codex/references/shotcraft/source/demos/impact-feedback/AnimeImpact.tsx +149 -0
  192. package/skills/hyper-animator-codex/references/shotcraft/source/demos/impact-feedback/HitCounter.tsx +147 -0
  193. package/skills/hyper-animator-codex/references/shotcraft/source/demos/input-trigger-moves/CursorPerformancePunchIn.tsx +154 -0
  194. package/skills/hyper-animator-codex/references/shotcraft/source/demos/input-trigger-moves/KeycapSmashCut.tsx +217 -0
  195. package/skills/hyper-animator-codex/references/shotcraft/source/demos/integration-hub-map/IntegrationHubMap.tsx +554 -0
  196. package/skills/hyper-animator-codex/references/shotcraft/source/demos/letterspace-materialize/LetterspaceMaterialize.tsx +85 -0
  197. package/skills/hyper-animator-codex/references/shotcraft/source/demos/light-play-moves/HalationBloom.tsx +139 -0
  198. package/skills/hyper-animator-codex/references/shotcraft/source/demos/light-play-moves/SheenSweepRetry.tsx +85 -0
  199. package/skills/hyper-animator-codex/references/shotcraft/source/demos/light-play-moves/SpotlightSweepReveal.tsx +102 -0
  200. package/skills/hyper-animator-codex/references/shotcraft/source/demos/line-boil/LineBoil.tsx +140 -0
  201. package/skills/hyper-animator-codex/references/shotcraft/source/demos/line-carry-transition/LineCarryTransition.tsx +151 -0
  202. package/skills/hyper-animator-codex/references/shotcraft/source/demos/magician-card-flourish/MagicianCardFlourish.tsx +294 -0
  203. package/skills/hyper-animator-codex/references/shotcraft/source/demos/marker-underline-title/MarkerUnderlineTitle.tsx +87 -0
  204. package/skills/hyper-animator-codex/references/shotcraft/source/demos/montage-rhythm-moves/DominoCascade.tsx +125 -0
  205. package/skills/hyper-animator-codex/references/shotcraft/source/demos/montage-rhythm-moves/DropBlackoutSlam.tsx +135 -0
  206. package/skills/hyper-animator-codex/references/shotcraft/source/demos/montage-rhythm-moves/WrightTripleCut.tsx +175 -0
  207. package/skills/hyper-animator-codex/references/shotcraft/source/demos/morph-from-primitive/MorphFromPrimitive.tsx +190 -0
  208. package/skills/hyper-animator-codex/references/shotcraft/source/demos/neon-frame-forerun/NeonFrameForerun.tsx +279 -0
  209. package/skills/hyper-animator-codex/references/shotcraft/source/demos/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx +273 -0
  210. package/skills/hyper-animator-codex/references/shotcraft/source/demos/neon-triple-marquee/NeonTripleMarquee.tsx +111 -0
  211. package/skills/hyper-animator-codex/references/shotcraft/source/demos/odometer-digit-roll/OdometerDigitRoll.tsx +178 -0
  212. package/skills/hyper-animator-codex/references/shotcraft/source/demos/overhead-camera-moves/OverheadTabletopDrop.tsx +129 -0
  213. package/skills/hyper-animator-codex/references/shotcraft/source/demos/overhead-camera-moves/TiltReveal.tsx +55 -0
  214. package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-turn-transitions/BarnDoorSplit.tsx +138 -0
  215. package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-turn-transitions/CubeRotate.tsx +114 -0
  216. package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-waterfall-wall/PageWaterfallWall.tsx +76 -0
  217. package/skills/hyper-animator-codex/references/shotcraft/source/demos/page-waterfall-wall/VerticalTicker.tsx +129 -0
  218. package/skills/hyper-animator-codex/references/shotcraft/source/demos/panel-grid-moves/ComicPanelSplit.tsx +171 -0
  219. package/skills/hyper-animator-codex/references/shotcraft/source/demos/panel-grid-moves/FlipGridReflow.tsx +121 -0
  220. package/skills/hyper-animator-codex/references/shotcraft/source/demos/panel-grid-moves/GridFlashMosaic.tsx +182 -0
  221. package/skills/hyper-animator-codex/references/shotcraft/source/demos/paper-craft-moves/MaskingTapeSlap.tsx +163 -0
  222. package/skills/hyper-animator-codex/references/shotcraft/source/demos/paper-craft-moves/PopupBookRise.tsx +134 -0
  223. package/skills/hyper-animator-codex/references/shotcraft/source/demos/paper-plane-messenger/PaperPlaneMessenger.tsx +183 -0
  224. package/skills/hyper-animator-codex/references/shotcraft/source/demos/particle-celebrate-hits/ConfettiCrossfire.tsx +115 -0
  225. package/skills/hyper-animator-codex/references/shotcraft/source/demos/particle-celebrate-hits/CounterTickSparks.tsx +103 -0
  226. package/skills/hyper-animator-codex/references/shotcraft/source/demos/particle-sand-fill/ParticleSandFill.tsx +119 -0
  227. package/skills/hyper-animator-codex/references/shotcraft/source/demos/pill-slot-cycle/PillSlotCycle.tsx +220 -0
  228. package/skills/hyper-animator-codex/references/shotcraft/source/demos/print-texture-transitions/InkBleedReveal.tsx +81 -0
  229. package/skills/hyper-animator-codex/references/shotcraft/source/demos/rhythm-interrupt-moves/JumpCutPunchIn.tsx +72 -0
  230. package/skills/hyper-animator-codex/references/shotcraft/source/demos/rhythm-interrupt-moves/StrobeBlackFrames.tsx +99 -0
  231. package/skills/hyper-animator-codex/references/shotcraft/source/demos/riso-print-hits/RisoBeatPump.tsx +155 -0
  232. package/skills/hyper-animator-codex/references/shotcraft/source/demos/riso-print-hits/RisoMisregistrationHit.tsx +120 -0
  233. package/skills/hyper-animator-codex/references/shotcraft/source/demos/runway-ground-skim/RunwayGroundSkim.tsx +258 -0
  234. package/skills/hyper-animator-codex/references/shotcraft/source/demos/sakuga-timing-shift/SakugaTimingShift.tsx +178 -0
  235. package/skills/hyper-animator-codex/references/shotcraft/source/demos/scene-locked-title/SceneLockedTitle.tsx +98 -0
  236. package/skills/hyper-animator-codex/references/shotcraft/source/demos/scroll-brake-moves/BrakeReticleLock.tsx +171 -0
  237. package/skills/hyper-animator-codex/references/shotcraft/source/demos/scroll-brake-moves/ChangelogScrollBrake.tsx +117 -0
  238. package/skills/hyper-animator-codex/references/shotcraft/source/demos/segmented-thumb-hero/SegmentedThumbHero.tsx +213 -0
  239. package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/MaskWipeReal.tsx +67 -0
  240. package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/PortalWipeV2.tsx +128 -0
  241. package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/WhipBrakeReal.tsx +60 -0
  242. package/skills/hyper-animator-codex/references/shotcraft/source/demos/shot-transitions/WhipPanReal.tsx +45 -0
  243. package/skills/hyper-animator-codex/references/shotcraft/source/demos/skeleton-reveal/SkeletonReveal.tsx +283 -0
  244. package/skills/hyper-animator-codex/references/shotcraft/source/demos/slam-entrance-moves/ImpactBurstKit.tsx +185 -0
  245. package/skills/hyper-animator-codex/references/shotcraft/source/demos/slam-entrance-moves/KanadaPerspectiveSnap.tsx +91 -0
  246. package/skills/hyper-animator-codex/references/shotcraft/source/demos/slam-entrance-moves/ScoreSlam.tsx +225 -0
  247. package/skills/hyper-animator-codex/references/shotcraft/source/demos/smear-multiples/SmearMultiples.tsx +88 -0
  248. package/skills/hyper-animator-codex/references/shotcraft/source/demos/space-camera-moves/DroneDiveLanding.tsx +91 -0
  249. package/skills/hyper-animator-codex/references/shotcraft/source/demos/space-camera-moves/ExplodedView.tsx +178 -0
  250. package/skills/hyper-animator-codex/references/shotcraft/source/demos/space-camera-moves/SnorricamLock.tsx +130 -0
  251. package/skills/hyper-animator-codex/references/shotcraft/source/demos/spectrum-morph-ui/SpectrumMorphUi.tsx +129 -0
  252. package/skills/hyper-animator-codex/references/shotcraft/source/demos/speed-ramp-freeze/FreezeAnnotateReal.tsx +70 -0
  253. package/skills/hyper-animator-codex/references/shotcraft/source/demos/speed-ramp-freeze/SpeedRampReal.tsx +58 -0
  254. package/skills/hyper-animator-codex/references/shotcraft/source/demos/split-flap-title/SplitFlapFlip.tsx +189 -0
  255. package/skills/hyper-animator-codex/references/shotcraft/source/demos/spotlight-sweep-moves/CornerSpotlightReveal.tsx +121 -0
  256. package/skills/hyper-animator-codex/references/shotcraft/source/demos/spotlight-sweep-moves/GlowWakeSleepPanel.tsx +183 -0
  257. package/skills/hyper-animator-codex/references/shotcraft/source/demos/spotlight-sweep-moves/SlideSpotlightPan.tsx +171 -0
  258. package/skills/hyper-animator-codex/references/shotcraft/source/demos/steep-tilt-glide/SteepTiltGlide.tsx +315 -0
  259. package/skills/hyper-animator-codex/references/shotcraft/source/demos/stroke-segment-build/StrokeSegmentBuild.tsx +126 -0
  260. package/skills/hyper-animator-codex/references/shotcraft/source/demos/tear-streak-transitions/GlitchDisplace.tsx +107 -0
  261. package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/BulletTimeFreezeOrbit.tsx +219 -0
  262. package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/DutchRollToLevel.tsx +110 -0
  263. package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/PullBackIsolation.tsx +120 -0
  264. package/skills/hyper-animator-codex/references/shotcraft/source/demos/tension-camera-moves/SlowPushIn.tsx +96 -0
  265. package/skills/hyper-animator-codex/references/shotcraft/source/demos/text-as-mask/TextAsMask.tsx +94 -0
  266. package/skills/hyper-animator-codex/references/shotcraft/source/demos/text-column-converge/TextColumnConverge.tsx +122 -0
  267. package/skills/hyper-animator-codex/references/shotcraft/source/demos/theme-switch-moves/PaletteThemeRipple.tsx +207 -0
  268. package/skills/hyper-animator-codex/references/shotcraft/source/demos/theme-switch-moves/ThemeSweepToggle.tsx +123 -0
  269. package/skills/hyper-animator-codex/references/shotcraft/source/demos/timeline-travel/TimelineTravel.tsx +123 -0
  270. package/skills/hyper-animator-codex/references/shotcraft/source/demos/title-demote-to-label/TitleDemoteToLabel.tsx +174 -0
  271. package/skills/hyper-animator-codex/references/shotcraft/source/demos/trailer-grammar-moves/CardFootageCadence.tsx +118 -0
  272. package/skills/hyper-animator-codex/references/shotcraft/source/demos/trailer-grammar-moves/SmashCut.tsx +105 -0
  273. package/skills/hyper-animator-codex/references/shotcraft/source/demos/trailer-grammar-moves/TrailerBumper.tsx +103 -0
  274. package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-hidden-cut/InvisibleCut.tsx +93 -0
  275. package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-hidden-cut/LightLeakBurn.tsx +122 -0
  276. package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-hidden-cut/VersusSlam.tsx +104 -0
  277. package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-travel/LetterformZoom.tsx +141 -0
  278. package/skills/hyper-animator-codex/references/shotcraft/source/demos/transition-travel/SharedElementMorph.tsx +101 -0
  279. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/LetterformDriftAssembly.tsx +107 -0
  280. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/SplitTextStagger.tsx +101 -0
  281. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/TextOnPath.tsx +92 -0
  282. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-assembly-moves/TrackingExpandReveal.tsx +109 -0
  283. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-entrance-moves/LetterDropPhysics.tsx +100 -0
  284. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-entrance-moves/ScrambleDecode.tsx +90 -0
  285. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-rhythm-sync/FontWeightPump.tsx +124 -0
  286. package/skills/hyper-animator-codex/references/shotcraft/source/demos/type-rhythm-sync/KaraokeFillSync.tsx +93 -0
  287. package/skills/hyper-animator-codex/references/shotcraft/source/demos/typewriter-moves/TerminalTypewriter.tsx +122 -0
  288. package/skills/hyper-animator-codex/references/shotcraft/source/demos/typewriter-moves/TypewriterErrorRetype.tsx +109 -0
  289. package/skills/hyper-animator-codex/references/shotcraft/source/demos/ui-strip-away-outro/UiStripAwayOutro.tsx +218 -0
  290. package/skills/hyper-animator-codex/references/shotcraft/source/demos/ui-to-brand-morph/IconFlipBloomLogo.tsx +199 -0
  291. package/skills/hyper-animator-codex/references/shotcraft/source/demos/ui-to-brand-morph/InputMorphsIntoLogo.tsx +215 -0
  292. package/skills/hyper-animator-codex/references/shotcraft/source/demos/voice-waveform-live/VoiceWaveformLive.tsx +171 -0
  293. package/skills/hyper-animator-codex/references/shotcraft/source/demos/wall-reveal-moves/BentoLightUp.tsx +135 -0
  294. package/skills/hyper-animator-codex/references/shotcraft/source/demos/wipe-transitions/BlindsSlice.tsx +107 -0
  295. package/skills/hyper-animator-codex/references/shotcraft/source/demos/wipe-transitions/ClockWipe.tsx +83 -0
  296. package/skills/hyper-animator-codex/references/shotcraft/source/demos/word-relay-filmstrip/WordRelayFilmstrip.tsx +300 -0
  297. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/Root.tsx +15 -0
  298. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/Caption.tsx +49 -0
  299. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/DigitRoll.tsx +44 -0
  300. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/FlashCut.tsx +19 -0
  301. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/Main.tsx +163 -0
  302. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/PaperTitleCard.tsx +89 -0
  303. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/PageCam.tsx +145 -0
  304. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneDetail.tsx +146 -0
  305. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneFlyIn.tsx +447 -0
  306. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneOpen.tsx +532 -0
  307. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneOutroLive.tsx +394 -0
  308. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/ScenePapers.tsx +185 -0
  309. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/aifl/live/SceneWbr.tsx +299 -0
  310. package/skills/hyper-animator-codex/references/shotcraft/source/template/src/index.ts +4 -0
  311. package/skills/hyper-animator-codex/references/shotcraft/source-notes.md +10 -0
  312. package/skills/hyper-animator-codex/scripts/generate_minimax_music.mjs +27 -10
  313. package/skills/hyper-animator-codex/scripts/generate_minimax_tts.mjs +142 -13
  314. package/skills/hyper-animator-codex/scripts/generate_subtitles.mjs +42 -3
  315. package/skills/hyper-animator-codex/scripts/minimax_runtime_config.mjs +3 -3
  316. package/skills/hyper-animator-codex/scripts/query_shotcraft.mjs +140 -0
  317. package/skills/hyper-animator-codex/scripts/validate_hyperframes_html.py +22 -0
  318. package/skills/hyper-animator-codex/scripts/validate_provider_policy.mjs +108 -0
  319. package/skills/hyper-animator-codex/scripts/validate_shot_plan.mjs +193 -0
  320. package/skills/hyper-animator-codex/vendor/music-beat-detector/beat_detector/analyzer.py +3 -1
  321. package/skills/hyper-animator-codex/vendor/music-beat-detector/beat_detector/beat.py +37 -1
@@ -0,0 +1,299 @@
1
+ import { interpolate, useCurrentFrame, Easing } from 'remotion';
2
+ import { PageCam, CamKey } from './PageCam';
3
+ import layout from '../live-layout.json';
4
+
5
+ type Block = { x: number; y: number; w: number; h: number; tag: string };
6
+ const blocks = layout.wbr.blocks as Block[];
7
+ const leftRail = layout.wbr.leftRail;
8
+ const rightRail = layout.wbr.rightRail;
9
+ const PAGE_H = layout.wbr.pageH;
10
+
11
+ const MONO = 'ui-monospace, SFMono-Regular, Menlo, monospace';
12
+ const PAPER = '#fdfcfa';
13
+ const AMBER = 'oklch(52% 0.115 65)';
14
+ const AMBER_WASH = 'oklch(95% 0.05 85)';
15
+
16
+ // editor-title close-up → ease out to the whole page (both rails on camera)
17
+ // → tiny breathing hold.
18
+ const CAM_KEYS: CamKey[] = [
19
+ { frame: 0, cx: 920, cy: 280, zoom: 1.25 },
20
+ { frame: 22, cx: 920, cy: 310, zoom: 1.21 }, // slow push while the title writes in
21
+ { frame: 64, cx: 960, cy: 540, zoom: 0.997 }, // whole page, rails fully in frame
22
+ { frame: 78, cx: 960, cy: 540, zoom: 1.003 }, // micro-breath
23
+ { frame: 102, cx: 960, cy: 540, zoom: 0.995 }, // exhale — whole-page reading hold
24
+ ];
25
+
26
+ const REVEAL_EASE = Easing.bezier(0.4, 0, 0.6, 1);
27
+
28
+ // 20 content blocks would overshoot the 70-frame reveal budget one-by-one, so
29
+ // blocks are revealed two at a time: pair g starts at 6 + g*3.5, 8 frames each
30
+ // (last pair done by ~49, well before the frame-64 full-page settle).
31
+ const cueFor = (i: number) => 6 + Math.floor(i / 2) * 3.5;
32
+ const WIPE = 8;
33
+
34
+ // ---- past weeks stack into the left rail: the captured texture only holds
35
+ // the live W28 entry, so W27…W22 drop in from above one after another (list
36
+ // stacking, same vocabulary as the papers shot), landing below it. ----
37
+ const SANS = 'ui-sans-serif, system-ui, -apple-system, sans-serif';
38
+ const PAST_WEEKS = [
39
+ { week: '2026 第 27 周', date: '7月3日', title: '2026-W27 · Foundation Lab Weekly' },
40
+ { week: '2026 第 26 周', date: '6月26日', title: '2026-W26 · Foundation Lab Weekly' },
41
+ { week: '2026 第 25 周', date: '6月19日', title: '2026-W25 · Foundation Lab Weekly' },
42
+ { week: '2026 第 24 周', date: '6月12日', title: '2026-W24 · Foundation Lab Weekly' },
43
+ { week: '2026 第 23 周', date: '6月5日', title: '2026-W23 · Foundation Lab Weekly' },
44
+ { week: '2026 第 22 周', date: '5月29日', title: '2026-W22 · Foundation Lab Weekly' },
45
+ ];
46
+ const WEEK_Y0 = 228; // just under the baked-in W28 entry
47
+ const WEEK_H = 56;
48
+ const WEEK_CUE = (i: number) => 58 + i * 5; // after the left rail wipes on (46–56)
49
+ const WEEK_DROP = Easing.bezier(0.2, 1.15, 0.3, 1); // drop with a light bounce
50
+
51
+ // member-name headings (tag=h2) get the @-mention amber wash; the pinned
52
+ // "Jackie's Download" digest heading (the first h2) is not a member name.
53
+ const memberH2 = new Set<number>();
54
+ {
55
+ let seenH2 = 0;
56
+ blocks.forEach((b, i) => {
57
+ if (b.tag === 'h2' && seenH2++ > 0) memberH2.add(i);
58
+ });
59
+ }
60
+
61
+ /** Weekly brief: the full report is "written" in block by block (paper mask
62
+ * wipes left→right behind an amber caret), member names get an @-mention amber
63
+ * wash, then the week list (left) and comment sidebar (right) wipe on stage —
64
+ * the whole page, both rails included, settles into frame. */
65
+ export const SceneWbr: React.FC = () => {
66
+ const frame = useCurrentFrame();
67
+
68
+ // screen-space kicker stamps in
69
+ const kick = interpolate(frame, [8, 16], [0, 1], {
70
+ extrapolateLeft: 'clamp',
71
+ extrapolateRight: 'clamp',
72
+ });
73
+
74
+ // caret follows only the newest block still being written
75
+ let caretIdx = -1;
76
+ blocks.forEach((_, i) => {
77
+ if (frame >= cueFor(i) && frame <= cueFor(i) + WIPE + 2) caretIdx = i;
78
+ });
79
+
80
+ return (
81
+ <>
82
+ <PageCam src="textures/live/wbr-full.png" pageH={PAGE_H} keys={CAM_KEYS} ease={Easing.bezier(0.33, 0, 0.15, 1)}>
83
+ {blocks.map((p, i) => {
84
+ const cue = cueFor(i);
85
+ // paper cover wipes away left→right (anchored right, width 100%→0)
86
+ const coverT = interpolate(frame, [cue, cue + WIPE], [1, 0], {
87
+ extrapolateLeft: 'clamp',
88
+ extrapolateRight: 'clamp',
89
+ easing: REVEAL_EASE,
90
+ });
91
+ // li boxes exclude their ::marker dot (drawn ~22px left of the text),
92
+ // so bullet covers extend left to hide the dot until the wipe.
93
+ const bx = p.tag === 'li' ? p.x - 28 : p.x - 4;
94
+ const by = p.y - 3;
95
+ const bw = p.w + (p.tag === 'li' ? 34 : 10);
96
+ const bh = p.h + 6;
97
+
98
+ // caret rides the reveal front edge (left edge of the cover)
99
+ const caretX = bx + bw * (1 - coverT);
100
+ const caretH = Math.min(20, p.h - 2);
101
+
102
+ // member-name @-mention wash, 4 frames after the wipe completes,
103
+ // sized to the heading's true text width
104
+ const nameCue = cue + WIPE + 4;
105
+ const nameGrow = memberH2.has(i)
106
+ ? interpolate(frame, [nameCue, nameCue + 8], [0, 1], {
107
+ extrapolateLeft: 'clamp',
108
+ extrapolateRight: 'clamp',
109
+ easing: Easing.bezier(0.3, 0, 0.2, 1),
110
+ })
111
+ : 0;
112
+
113
+ return (
114
+ <div key={i}>
115
+ {/* @-mention wash on the member name (under the cover) */}
116
+ {nameGrow > 0 ? (
117
+ <div
118
+ style={{
119
+ position: 'absolute',
120
+ left: p.x - 3,
121
+ top: p.y - 1,
122
+ width: (p.w + 8) * nameGrow,
123
+ height: p.h + 2,
124
+ background: AMBER_WASH,
125
+ opacity: 0.7,
126
+ borderRadius: 3,
127
+ pointerEvents: 'none',
128
+ }}
129
+ />
130
+ ) : null}
131
+
132
+ {/* paper cover that wipes off to reveal the "written" text */}
133
+ {coverT > 0 ? (
134
+ <div
135
+ style={{
136
+ position: 'absolute',
137
+ left: bx,
138
+ top: by,
139
+ width: bw,
140
+ height: bh,
141
+ overflow: 'hidden',
142
+ pointerEvents: 'none',
143
+ }}
144
+ >
145
+ <div
146
+ style={{
147
+ position: 'absolute',
148
+ right: 0,
149
+ top: 0,
150
+ bottom: 0,
151
+ width: `${coverT * 100}%`,
152
+ background: PAPER,
153
+ }}
154
+ />
155
+ </div>
156
+ ) : null}
157
+
158
+ {/* amber caret at the writing front — newest block only */}
159
+ {i === caretIdx ? (
160
+ <div
161
+ style={{
162
+ position: 'absolute',
163
+ left: caretX,
164
+ top: p.y + (p.h - caretH) / 2,
165
+ width: 2,
166
+ height: caretH,
167
+ background: AMBER,
168
+ opacity:
169
+ coverT > 0
170
+ ? 1
171
+ : interpolate(frame, [cue + WIPE, cue + WIPE + 2], [1, 0], {
172
+ extrapolateLeft: 'clamp',
173
+ extrapolateRight: 'clamp',
174
+ }),
175
+ pointerEvents: 'none',
176
+ }}
177
+ />
178
+ ) : null}
179
+ </div>
180
+ );
181
+ })}
182
+
183
+ {/* side-rail entrances: each rail hides under a paper patch, then wipes
184
+ on top→bottom while its inner edge lights up amber and fades. */}
185
+ {[
186
+ { rail: leftRail, cue: 46, inner: 'right' as const },
187
+ { rail: rightRail, cue: 54, inner: 'left' as const },
188
+ ].map(({ rail, cue, inner }, i) => {
189
+ const t = interpolate(frame, [cue, cue + 10], [0, 1], {
190
+ extrapolateLeft: 'clamp',
191
+ extrapolateRight: 'clamp',
192
+ easing: Easing.bezier(0.3, 0, 0.2, 1),
193
+ });
194
+ const lineFade = interpolate(frame, [cue + 10, cue + 24], [1, 0], {
195
+ extrapolateLeft: 'clamp',
196
+ extrapolateRight: 'clamp',
197
+ });
198
+ return (
199
+ <div key={`rail${i}`}>
200
+ {/* paper patch shrinking downward = rail revealed top→bottom */}
201
+ {t < 1 ? (
202
+ <div
203
+ style={{
204
+ position: 'absolute',
205
+ left: rail.x,
206
+ top: rail.y + rail.h * t,
207
+ width: rail.w,
208
+ height: rail.h * (1 - t),
209
+ background: PAPER,
210
+ pointerEvents: 'none',
211
+ }}
212
+ />
213
+ ) : null}
214
+ {/* inner-edge amber line: grows with the wipe, then fades */}
215
+ {frame >= cue && lineFade > 0 ? (
216
+ <div
217
+ style={{
218
+ position: 'absolute',
219
+ left: inner === 'right' ? rail.x + rail.w - 1.5 : rail.x,
220
+ top: rail.y,
221
+ width: 1.5,
222
+ height: rail.h * t,
223
+ background: AMBER,
224
+ opacity: lineFade,
225
+ pointerEvents: 'none',
226
+ }}
227
+ />
228
+ ) : null}
229
+ </div>
230
+ );
231
+ })}
232
+ {/* past weeks drop into the left rail from above, stacking in order */}
233
+ {PAST_WEEKS.map((w, i) => {
234
+ const cue = WEEK_CUE(i);
235
+ if (frame < cue) return null;
236
+ const t = interpolate(frame, [cue, cue + 8], [0, 1], {
237
+ extrapolateLeft: 'clamp',
238
+ extrapolateRight: 'clamp',
239
+ easing: WEEK_DROP,
240
+ });
241
+ const appear = interpolate(frame, [cue, cue + 3], [0, 1], {
242
+ extrapolateLeft: 'clamp',
243
+ extrapolateRight: 'clamp',
244
+ });
245
+ const air = Math.max(0, 1 - t);
246
+ return (
247
+ <div
248
+ key={w.week}
249
+ style={{
250
+ position: 'absolute',
251
+ left: 4,
252
+ top: WEEK_Y0 + i * WEEK_H,
253
+ width: leftRail.w - 8,
254
+ height: WEEK_H,
255
+ transform: `translateY(${-44 * air}px)`,
256
+ opacity: appear,
257
+ boxShadow: air > 0.02 ? `0 ${10 * air}px ${20 * air}px rgba(30,25,18,${0.16 * air})` : 'none',
258
+ background: PAPER,
259
+ borderBottom: '1px solid rgba(31,41,55,0.07)',
260
+ padding: '8px 10px 0',
261
+ boxSizing: 'border-box',
262
+ fontFamily: SANS,
263
+ pointerEvents: 'none',
264
+ }}
265
+ >
266
+ <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline' }}>
267
+ <span style={{ fontSize: 13, fontWeight: 500, color: '#1f2937' }}>{w.week}</span>
268
+ <span style={{ fontSize: 10, color: '#9ca3af' }}>{w.date}</span>
269
+ </div>
270
+ <div style={{ marginTop: 2, fontSize: 11, color: '#6b7280', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>
271
+ {w.title}
272
+ </div>
273
+ </div>
274
+ );
275
+ })}
276
+ </PageCam>
277
+
278
+ {/* screen-space kicker, top-right */}
279
+ <div
280
+ style={{
281
+ position: 'absolute',
282
+ top: 16, // inside the page's empty top-nav band at full-page framing,
283
+ right: 96, // clear of the comment rail's own header
284
+
285
+ textAlign: 'right',
286
+ fontFamily: MONO,
287
+ fontSize: 24,
288
+ letterSpacing: '0.14em',
289
+ color: 'oklch(50% 0.006 82)',
290
+ textTransform: 'uppercase',
291
+ opacity: kick,
292
+ pointerEvents: 'none',
293
+ }}
294
+ >
295
+ Weekly Brief · 2026-W28
296
+ </div>
297
+ </>
298
+ );
299
+ };
@@ -0,0 +1,4 @@
1
+ import { registerRoot } from 'remotion';
2
+ import { Root } from './Root';
3
+
4
+ registerRoot(Root);
@@ -0,0 +1,10 @@
1
+ # ShotCraft reference bundle
2
+
3
+ This is a lightweight, read-only knowledge layer derived from video-shotcraft
4
+ revision `bdd94be16d60fa8f` under Apache-2.0.
5
+
6
+ It contains 106 shot cards, 164 style
7
+ records, core production notes, and TypeScript/TSX references. Preview video,
8
+ audio, raster media, dependencies, and a runnable Remotion project are
9
+ intentionally excluded. Use `scripts/query_shotcraft.mjs` to select
10
+ references, then author the final output as HyperFrames HTML.
@@ -11,6 +11,7 @@ import {
11
11
  } from "./minimax_runtime_config.mjs";
12
12
 
13
13
  const DEFAULT_ENDPOINT = "https://api.minimaxi.com/v1/music_generation";
14
+ const PROVIDER = "minimax_cn";
14
15
  const scriptDir = dirname(fileURLToPath(import.meta.url));
15
16
  const skillRoot = dirname(scriptDir);
16
17
 
@@ -107,7 +108,7 @@ Options:
107
108
  --format <mp3|wav|pcm> Audio encoding format, default mp3
108
109
  --sample-rate <rate> 16000, 24000, 32000, or 44100; default 44100
109
110
  --bitrate <bits> 32000, 64000, 128000, or 256000; default 256000
110
- --model <model> music-2.6 or music-2.6-free
111
+ --model <model> music-3.0, music-2.6, or music-2.6-free
111
112
  --config <file> Explicit MiniMax config JSON
112
113
  --request-json <file> Read request options from a JSON file
113
114
  --dry-run Print redacted request without contacting MiniMax
@@ -147,18 +148,32 @@ function mergeOptions(jsonOptions, cliOptions) {
147
148
  }
148
149
 
149
150
  function endpointFromEnv(env = process.env) {
150
- return env.MINIMAX_MUSIC_ENDPOINT || DEFAULT_ENDPOINT;
151
+ const endpoint = env.MINIMAX_MUSIC_ENDPOINT || DEFAULT_ENDPOINT;
152
+ if (!URL.canParse(endpoint)) {
153
+ throw minimaxError(`MiniMax mainland China endpoint is not a valid URL: ${endpoint}`, {
154
+ kind: "validation",
155
+ retryable: false,
156
+ });
157
+ }
158
+ if (endpoint !== DEFAULT_ENDPOINT && env.MINIMAX_ALLOW_TEST_ENDPOINT !== "1") {
159
+ throw minimaxError(`MiniMax music generation must use the mainland China endpoint ${DEFAULT_ENDPOINT}`, {
160
+ kind: "validation",
161
+ retryable: false,
162
+ });
163
+ }
164
+ return endpoint;
151
165
  }
152
166
 
153
167
  function timeoutFromEnv(env = process.env) {
154
- const value = Number.parseInt(env.MINIMAX_REQUEST_TIMEOUT_MS || "60000", 10);
168
+ const value = Number.parseInt(env.MINIMAX_REQUEST_TIMEOUT_MS || "1800000", 10);
155
169
  return Number.isFinite(value) && value > 0 ? value : 60000;
156
170
  }
157
171
 
158
172
  function makeErrorEnvelope(error, attempts = 0) {
159
173
  return {
160
174
  ok: false,
161
- provider: "minimax",
175
+ provider: PROVIDER,
176
+ region: "cn",
162
177
  error: {
163
178
  kind: error.kind || "validation",
164
179
  message: error.message,
@@ -431,7 +446,8 @@ async function writeAudioOutput({ responseJson, request, outputDir, prompt, endp
431
446
  await writeFile(
432
447
  metadataPath,
433
448
  `${JSON.stringify({
434
- provider: "minimax",
449
+ provider: PROVIDER,
450
+ region: "cn",
435
451
  endpoint,
436
452
  request,
437
453
  response: {
@@ -456,13 +472,12 @@ async function writeAudioOutput({ responseJson, request, outputDir, prompt, endp
456
472
  async function main() {
457
473
  try {
458
474
  const cliOptions = parseArgs(process.argv.slice(2));
459
- const endpoint = endpointFromEnv();
460
- const timeoutMs = timeoutFromEnv();
461
-
462
475
  if (cliOptions.help) {
463
476
  printHelp();
464
477
  return;
465
478
  }
479
+ const endpoint = endpointFromEnv();
480
+ const timeoutMs = timeoutFromEnv();
466
481
 
467
482
  const requestJson = await readRequestJson(cliOptions.request_json);
468
483
  const options = mergeOptions(requestJson, cliOptions);
@@ -499,7 +514,8 @@ async function main() {
499
514
  printJson({
500
515
  ok: true,
501
516
  dry_run: true,
502
- provider: "minimax",
517
+ provider: PROVIDER,
518
+ region: "cn",
503
519
  endpoint,
504
520
  config: {
505
521
  source: runtime.source,
@@ -527,7 +543,8 @@ async function main() {
527
543
 
528
544
  printJson({
529
545
  ok: true,
530
- provider: "minimax",
546
+ provider: PROVIDER,
547
+ region: "cn",
531
548
  model: request.model,
532
549
  attempts,
533
550
  output_path: output.audioPath,
@@ -10,6 +10,9 @@ import {
10
10
 
11
11
  const DEFAULT_TTS_ENDPOINT = "https://api.minimaxi.com/v1/t2a_v2";
12
12
  const DEFAULT_VOICE_ENDPOINT = "https://api.minimaxi.com/v1/get_voice";
13
+ const BACKUP_TTS_ENDPOINT = "https://api-bj.minimaxi.com/v1/t2a_v2";
14
+ const BACKUP_VOICE_ENDPOINT = "https://api-bj.minimaxi.com/v1/get_voice";
15
+ const PROVIDER = "minimax_cn";
13
16
  const DEFAULT_TTS_MODEL = "speech-2.8-hd";
14
17
  const DEFAULT_VOICE_ID = "XiaoR_001";
15
18
  const EMOTIONS = new Set(["happy", "sad", "angry", "fearful", "disgusted", "surprised", "calm", "fluent", "whipser"]);
@@ -46,6 +49,7 @@ function parseArgs(args) {
46
49
  pitch: undefined,
47
50
  subtitle_enable: undefined,
48
51
  config_path: undefined,
52
+ split_scenes: false,
49
53
  dry_run: false,
50
54
  };
51
55
 
@@ -106,6 +110,8 @@ function parseArgs(args) {
106
110
  } else if (arg === "--config") {
107
111
  parsed.config_path = requireValue(args, index, arg);
108
112
  index += 1;
113
+ } else if (arg === "--split-scenes") {
114
+ parsed.split_scenes = true;
109
115
  } else if (arg === "--dry-run") {
110
116
  parsed.dry_run = true;
111
117
  } else if (arg === "--help" || arg === "-h") {
@@ -142,6 +148,7 @@ Options:
142
148
  --volume <value> Default 1
143
149
  --pitch <value> Default 0
144
150
  --subtitle-enable Ask MiniMax to include subtitle data when available
151
+ --split-scenes Generate one file per narration scene and an exact timing manifest
145
152
  --config <file> Explicit MiniMax config JSON
146
153
  --dry-run Print redacted request without contacting MiniMax
147
154
  `);
@@ -160,7 +167,8 @@ function minimaxError(message, fields = {}) {
160
167
  function makeErrorEnvelope(error, attempts = 0) {
161
168
  return {
162
169
  ok: false,
163
- provider: "minimax",
170
+ provider: PROVIDER,
171
+ region: "cn",
164
172
  error: {
165
173
  kind: error.kind || "validation",
166
174
  message: error.message,
@@ -280,14 +288,34 @@ function buildTtsRequest(options) {
280
288
  }
281
289
 
282
290
  function endpointFromEnv(env = process.env) {
291
+ const tts = env.MINIMAX_TTS_ENDPOINT || DEFAULT_TTS_ENDPOINT;
292
+ const voice = env.MINIMAX_VOICE_ENDPOINT || DEFAULT_VOICE_ENDPOINT;
293
+ const allowTest = env.MINIMAX_ALLOW_TEST_ENDPOINT === "1";
294
+
295
+ for (const [label, endpoint, allowed] of [
296
+ ["TTS", tts, [DEFAULT_TTS_ENDPOINT, BACKUP_TTS_ENDPOINT]],
297
+ ["voice", voice, [DEFAULT_VOICE_ENDPOINT, BACKUP_VOICE_ENDPOINT]],
298
+ ]) {
299
+ if (!URL.canParse(endpoint)) {
300
+ throw minimaxError(`MiniMax mainland China ${label} endpoint is not a valid URL: ${endpoint}`, {
301
+ kind: "validation",
302
+ });
303
+ }
304
+ if (!allowTest && !allowed.includes(endpoint)) {
305
+ throw minimaxError(`MiniMax ${label} requests must use a mainland China minimaxi.com endpoint`, {
306
+ kind: "validation",
307
+ });
308
+ }
309
+ }
310
+
283
311
  return {
284
- tts: env.MINIMAX_TTS_ENDPOINT || DEFAULT_TTS_ENDPOINT,
285
- voice: env.MINIMAX_VOICE_ENDPOINT || DEFAULT_VOICE_ENDPOINT,
312
+ tts,
313
+ voice,
286
314
  };
287
315
  }
288
316
 
289
317
  function timeoutFromEnv(env = process.env) {
290
- const value = Number.parseInt(env.MINIMAX_REQUEST_TIMEOUT_MS || "60000", 10);
318
+ const value = Number.parseInt(env.MINIMAX_REQUEST_TIMEOUT_MS || "1800000", 10);
291
319
  return Number.isFinite(value) && value > 0 ? value : 60000;
292
320
  }
293
321
 
@@ -392,7 +420,7 @@ function safeFileStem(value) {
392
420
  return stem || "minimax-tts";
393
421
  }
394
422
 
395
- async function writeTtsOutput({ responseJson, request, outputDir, endpoint }) {
423
+ async function writeTtsOutput({ responseJson, request, outputDir, endpoint, fileStem }) {
396
424
  if (responseJson.data?.status !== 2) {
397
425
  throw minimaxError(`MiniMax TTS generation is not complete; data.status is ${responseJson.data?.status}`, { kind: "provider" });
398
426
  }
@@ -401,15 +429,16 @@ async function writeTtsOutput({ responseJson, request, outputDir, endpoint }) {
401
429
  }
402
430
 
403
431
  await mkdir(outputDir, { recursive: true });
404
- const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
405
432
  const extension = request.audio_setting.format === "pcm" ? "pcm" : request.audio_setting.format;
406
- const stem = `${safeFileStem(request.voice_setting.voice_id)}-${timestamp}`;
433
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
434
+ const stem = fileStem || `${safeFileStem(request.voice_setting.voice_id)}-${timestamp}`;
407
435
  const audioPath = join(outputDir, `${stem}.${extension}`);
408
436
  const metadataPath = join(outputDir, `${stem}.minimax-tts.json`);
409
437
 
410
438
  await writeFile(audioPath, decodeHexAudio(responseJson.data.audio));
411
439
  await writeFile(metadataPath, `${JSON.stringify({
412
- provider: "minimax",
440
+ provider: PROVIDER,
441
+ region: "cn",
413
442
  endpoint,
414
443
  request,
415
444
  response: {
@@ -467,7 +496,8 @@ async function listVoices(options, runtime, endpoints, timeoutMs) {
467
496
 
468
497
  return {
469
498
  ok: true,
470
- provider: "minimax",
499
+ provider: PROVIDER,
500
+ region: "cn",
471
501
  endpoint: endpoints.voice,
472
502
  voice_type: options.voice_type,
473
503
  config: {
@@ -479,16 +509,84 @@ async function listVoices(options, runtime, endpoints, timeoutMs) {
479
509
  };
480
510
  }
481
511
 
512
+ async function generateSplitScenes({
513
+ narration,
514
+ options,
515
+ runtime,
516
+ endpoint,
517
+ timeoutMs,
518
+ narrationPath,
519
+ }) {
520
+ if (!narration) {
521
+ throw minimaxError("--split-scenes requires --narration-json", { kind: "validation" });
522
+ }
523
+
524
+ await mkdir(options.output_dir, { recursive: true });
525
+ const scenes = [];
526
+ let elapsedMs = 0;
527
+
528
+ for (let index = 0; index < narration.scenes.length; index += 1) {
529
+ const scene = narration.scenes[index];
530
+ const sceneOptions = { ...options, text: scene.narration.trim() };
531
+ validateOptions(sceneOptions);
532
+ const request = buildTtsRequest(sceneOptions);
533
+ const responseJson = await postMiniMax(runtime.config, endpoint, request, timeoutMs);
534
+ const output = await writeTtsOutput({
535
+ responseJson,
536
+ request,
537
+ outputDir: options.output_dir,
538
+ endpoint,
539
+ fileStem: `scene-${String(index + 1).padStart(3, "0")}`,
540
+ });
541
+ const durationMs = Number(responseJson.extra_info?.audio_length);
542
+ if (!Number.isFinite(durationMs) || durationMs <= 0) {
543
+ throw minimaxError(`MiniMax scene ${index + 1} did not return extra_info.audio_length`, {
544
+ kind: "response",
545
+ });
546
+ }
547
+
548
+ scenes.push({
549
+ scene: scene.scene ?? index + 1,
550
+ title: scene.title ?? null,
551
+ sync_hint: scene.sync_hint ?? null,
552
+ narration: scene.narration,
553
+ duration_ms: durationMs,
554
+ start_seconds: elapsedMs / 1000,
555
+ end_seconds: (elapsedMs + durationMs) / 1000,
556
+ output_path: output.audioPath,
557
+ metadata_path: output.metadataPath,
558
+ });
559
+ elapsedMs += durationMs;
560
+ }
561
+
562
+ const manifestPath = join(options.output_dir, "narration-manifest.json");
563
+ await writeFile(manifestPath, `${JSON.stringify({
564
+ schema_version: "1.0.0",
565
+ provider: PROVIDER,
566
+ region: "cn",
567
+ endpoint,
568
+ narration_path: narrationPath,
569
+ model: options.model,
570
+ voice_id: options.voice_id,
571
+ emotion: options.emotion,
572
+ duration_ms: elapsedMs,
573
+ duration_seconds: elapsedMs / 1000,
574
+ scenes,
575
+ }, null, 2)}\n`, "utf8");
576
+
577
+ return { manifestPath, scenes, durationMs: elapsedMs };
578
+ }
579
+
482
580
  async function main() {
483
581
  try {
484
582
  const cliOptions = parseArgs(process.argv.slice(2));
485
- const endpoints = endpointFromEnv();
486
- const timeoutMs = timeoutFromEnv();
487
583
 
488
584
  if (cliOptions.help) {
489
585
  printHelp();
490
586
  return;
491
587
  }
588
+ const endpoints = endpointFromEnv();
589
+ const timeoutMs = timeoutFromEnv();
492
590
 
493
591
  const runtime = await readRuntime(cliOptions);
494
592
 
@@ -514,7 +612,8 @@ async function main() {
514
612
  printJson({
515
613
  ok: true,
516
614
  dry_run: true,
517
- provider: "minimax",
615
+ provider: PROVIDER,
616
+ region: "cn",
518
617
  endpoint: endpoints.tts,
519
618
  config: {
520
619
  source: runtime.source,
@@ -524,11 +623,40 @@ async function main() {
524
623
  request_path: cliOptions.request_json,
525
624
  narration_path: cliOptions.narration_json,
526
625
  request,
626
+ scene_requests: cliOptions.split_scenes
627
+ ? narration.scenes.map((scene) => buildTtsRequest({ ...options, text: scene.narration.trim() }))
628
+ : undefined,
527
629
  output_dir: options.output_dir,
528
630
  });
529
631
  return;
530
632
  }
531
633
 
634
+ if (cliOptions.split_scenes) {
635
+ const split = await generateSplitScenes({
636
+ narration,
637
+ options,
638
+ runtime,
639
+ endpoint: endpoints.tts,
640
+ timeoutMs,
641
+ narrationPath: cliOptions.narration_json,
642
+ });
643
+ printJson({
644
+ ok: true,
645
+ provider: PROVIDER,
646
+ region: "cn",
647
+ mode: "split_scenes",
648
+ model: options.model,
649
+ voice_id: options.voice_id,
650
+ emotion: options.emotion,
651
+ scene_count: split.scenes.length,
652
+ duration_ms: split.durationMs,
653
+ duration_seconds: split.durationMs / 1000,
654
+ manifest_path: split.manifestPath,
655
+ outputs: split.scenes.map((scene) => scene.output_path),
656
+ });
657
+ return;
658
+ }
659
+
532
660
  const responseJson = await postMiniMax(runtime.config, endpoints.tts, request, timeoutMs);
533
661
  const output = await writeTtsOutput({
534
662
  responseJson,
@@ -539,7 +667,8 @@ async function main() {
539
667
 
540
668
  printJson({
541
669
  ok: true,
542
- provider: "minimax",
670
+ provider: PROVIDER,
671
+ region: "cn",
543
672
  model: request.model,
544
673
  voice_id: request.voice_setting.voice_id,
545
674
  emotion: request.voice_setting.emotion,