dsh-hyperframes 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +52 -6
- package/README.md +51 -7
- package/lib/index.d.ts +8 -41
- package/lib/index.js +38 -99
- package/lib/skill-bundle.d.ts +56 -0
- package/lib/skill-bundle.js +218 -0
- package/package.json +1 -1
- package/skills/embedded-captions/CATALOG.md +91 -0
- package/skills/embedded-captions/SKILL.md +258 -0
- package/skills/embedded-captions/assets/fonts/char-widths.json +2211 -0
- package/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +242 -0
- package/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +242 -0
- package/skills/embedded-captions/dna/README.md +148 -0
- package/skills/embedded-captions/dna/chrome.json +68 -0
- package/skills/embedded-captions/dna/cream.json +69 -0
- package/skills/embedded-captions/dna/documentary.json +62 -0
- package/skills/embedded-captions/dna/editorial.json +70 -0
- package/skills/embedded-captions/dna/glitch.json +82 -0
- package/skills/embedded-captions/dna/ink.json +65 -0
- package/skills/embedded-captions/dna/keynote.json +62 -0
- package/skills/embedded-captions/dna/loud.json +75 -0
- package/skills/embedded-captions/dna/neon.json +58 -0
- package/skills/embedded-captions/dna/velocity.json +89 -0
- package/skills/embedded-captions/modes/cinematic/README.md +48 -0
- package/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +98 -0
- package/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +188 -0
- package/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +134 -0
- package/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +179 -0
- package/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +81 -0
- package/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +170 -0
- package/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +16 -0
- package/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +226 -0
- package/skills/embedded-captions/modes/cinematic/engine.html +355 -0
- package/skills/embedded-captions/modes/standard/_anatomy.md +233 -0
- package/skills/embedded-captions/modes/standard/_motion.md +192 -0
- package/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs +97 -0
- package/skills/embedded-captions/modes/standard/fonts/files/anton-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/audiowide-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/baloo-2-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/baloo-2-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/bangers-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/bodoni-moda-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/bodoni-moda-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/caveat-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/caveat-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/chakra-petch-latin-500-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/chakra-petch-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/cinzel-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/cinzel-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/cormorant-garamond-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/cormorant-garamond-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/creepster-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/fredoka-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/fredoka-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-500-italic.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-500-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-600-italic.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-600-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-800-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-900-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/monoton-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/orbitron-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/orbitron-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/permanent-marker-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/press-start-2p-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/rajdhani-latin-500-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/rajdhani-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/saira-stencil-one-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/shippori-mincho-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/shippori-mincho-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/sora-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/sora-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/space-grotesk-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/space-grotesk-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/special-elite-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/teko-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/teko-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/vt323-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/fonts.css +401 -0
- package/skills/embedded-captions/references/aesthetic-principles.md +168 -0
- package/skills/embedded-captions/references/anti-patterns.md +188 -0
- package/skills/embedded-captions/references/bespoke-vs-presets.md +178 -0
- package/skills/embedded-captions/references/caption-grouping.md +130 -0
- package/skills/embedded-captions/references/composition-craft.md +522 -0
- package/skills/embedded-captions/references/direction-catalog.md +138 -0
- package/skills/embedded-captions/references/example-renders/champion.html +371 -0
- package/skills/embedded-captions/references/example-renders/memory-wall.html +334 -0
- package/skills/embedded-captions/references/failure-modes.md +145 -0
- package/skills/embedded-captions/references/layout-heuristics.md +238 -0
- package/skills/embedded-captions/references/motion-vocabulary.md +148 -0
- package/skills/embedded-captions/references/rail.md +68 -0
- package/skills/embedded-captions/references/reference-bar.md +47 -0
- package/skills/embedded-captions/references/scene-types.md +94 -0
- package/skills/embedded-captions/references/typographic-moves.md +266 -0
- package/skills/embedded-captions/references/typography-presets.md +63 -0
- package/skills/embedded-captions/scripts/audio-envelope.cjs +95 -0
- package/skills/embedded-captions/scripts/check-occlusion.cjs +250 -0
- package/skills/embedded-captions/scripts/check-overflow.cjs +194 -0
- package/skills/embedded-captions/scripts/check-rail-climax.cjs +233 -0
- package/skills/embedded-captions/scripts/check-timing.cjs +173 -0
- package/skills/embedded-captions/scripts/fill-timings.cjs +124 -0
- package/skills/embedded-captions/scripts/fit-fonts.cjs +158 -0
- package/skills/embedded-captions/scripts/gen-stroke-path.py +57 -0
- package/skills/embedded-captions/scripts/inject-fonts.cjs +169 -0
- package/skills/embedded-captions/scripts/lib-dna.cjs +201 -0
- package/skills/embedded-captions/scripts/make-cinematic.cjs +1206 -0
- package/skills/embedded-captions/scripts/make-composition.cjs +405 -0
- package/skills/embedded-captions/scripts/make-theme.cjs +8585 -0
- package/skills/embedded-captions/scripts/matte.cjs +280 -0
- package/skills/embedded-captions/scripts/measure-layout.cjs +293 -0
- package/skills/embedded-captions/scripts/prepare.sh +39 -0
- package/skills/embedded-captions/scripts/preview-frames.cjs +268 -0
- package/skills/embedded-captions/scripts/render-and-composite.sh +469 -0
- package/skills/embedded-captions/scripts/render-theme.sh +34 -0
- package/skills/embedded-captions/scripts/safe-zones.cjs +813 -0
- package/skills/embedded-captions/scripts/transcribe.cjs +332 -0
- package/skills/embedded-captions/themes/README.md +243 -0
- package/skills/embedded-captions/themes/anchor.json +27 -0
- package/skills/embedded-captions/themes/arcade.json +51 -0
- package/skills/embedded-captions/themes/aurora.json +41 -0
- package/skills/embedded-captions/themes/biolume.json +35 -0
- package/skills/embedded-captions/themes/brush.json +74 -0
- package/skills/embedded-captions/themes/chalkboard.json +52 -0
- package/skills/embedded-captions/themes/dossier.json +56 -0
- package/skills/embedded-captions/themes/graffiti.json +62 -0
- package/skills/embedded-captions/themes/hologram.json +41 -0
- package/skills/embedded-captions/themes/inkwater.json +43 -0
- package/skills/embedded-captions/themes/laser.json +46 -0
- package/skills/embedded-captions/themes/lastpage.json +33 -0
- package/skills/embedded-captions/themes/neonsign.json +53 -0
- package/skills/embedded-captions/themes/ordnance.json +54 -0
- package/skills/embedded-captions/themes/papercut.json +37 -0
- package/skills/embedded-captions/themes/popup.json +46 -0
- package/skills/embedded-captions/themes/ransom.json +62 -0
- package/skills/embedded-captions/themes/scoreboard.json +54 -0
- package/skills/embedded-captions/themes/spectrum.json +46 -0
- package/skills/embedded-captions/themes/stardust.json +29 -0
- package/skills/embedded-captions/themes/stomp.json +43 -0
- package/skills/embedded-captions/themes/terminal.json +49 -0
- package/skills/embedded-captions/themes/thunder.json +44 -0
- package/skills/embedded-captions/themes/transit.json +44 -0
- package/skills/embedded-captions/themes/vhs.json +47 -0
- package/skills/faceless-explainer/SKILL.md +233 -0
- package/skills/faceless-explainer/references/cut-catalog.md +215 -0
- package/skills/faceless-explainer/references/motion-language.md +156 -0
- package/skills/faceless-explainer/references/story-design.md +255 -0
- package/skills/faceless-explainer/references/visual-design.md +146 -0
- package/skills/faceless-explainer/scripts/assemble-index.mjs +623 -0
- package/skills/faceless-explainer/scripts/assemble-index.test.mjs +72 -0
- package/skills/faceless-explainer/scripts/audio.mjs +291 -0
- package/skills/faceless-explainer/scripts/audio.test.mjs +176 -0
- package/skills/faceless-explainer/scripts/build-frame.mjs +551 -0
- package/skills/faceless-explainer/scripts/captions.mjs +521 -0
- package/skills/faceless-explainer/scripts/captions.test.mjs +219 -0
- package/skills/faceless-explainer/scripts/frame-packets.mjs +27 -0
- package/skills/faceless-explainer/scripts/frame-packets.test.mjs +66 -0
- package/skills/faceless-explainer/scripts/lib/assets.mjs +56 -0
- package/skills/faceless-explainer/scripts/lib/dimensions.mjs +45 -0
- package/skills/faceless-explainer/scripts/lib/pad-frame-duration.mjs +36 -0
- package/skills/faceless-explainer/scripts/lib/storyboard.mjs +249 -0
- package/skills/faceless-explainer/scripts/lib/tokens.mjs +211 -0
- package/skills/faceless-explainer/scripts/lib/transition-registry.mjs +38 -0
- package/skills/faceless-explainer/scripts/lib/transitions.json +71 -0
- package/skills/faceless-explainer/scripts/transitions.mjs +383 -0
- package/skills/faceless-explainer/scripts/transitions.test.mjs +68 -0
- package/skills/faceless-explainer/sub-agents/frame-worker.md +12 -0
- package/skills/figma/SKILL.md +132 -0
- package/skills/figma/scripts/verify-motion.mjs +153 -0
- package/skills/general-video/SKILL.md +165 -0
- package/skills/general-video/scripts/frame-packets.mjs +38 -0
- package/skills/general-video/scripts/frame-packets.test.mjs +80 -0
- package/skills/general-video/sub-agents/frame-worker.md +34 -0
- package/skills/hyperframes/SKILL.md +98 -337
- package/skills/hyperframes/references/capability-menu.md +47 -0
- package/skills/hyperframes/references/intent-interview.md +71 -0
- package/skills/hyperframes/references/pitch-round.md +40 -0
- package/skills/hyperframes/references/route-briefs.md +11 -0
- package/skills/hyperframes/references/routes/embedded-captions.md +11 -0
- package/skills/hyperframes/references/routes/faceless-explainer.md +12 -0
- package/skills/hyperframes/references/routes/general-video.md +12 -0
- package/skills/hyperframes/references/routes/motion-graphics.md +11 -0
- package/skills/hyperframes/references/routes/music-to-video.md +12 -0
- package/skills/hyperframes/references/routes/pr-to-video.md +28 -0
- package/skills/hyperframes/references/routes/product-launch-video.md +13 -0
- package/skills/hyperframes/references/routes/remotion-to-hyperframes.md +9 -0
- package/skills/hyperframes/references/routes/slideshow.md +11 -0
- package/skills/hyperframes/references/routes/talking-head-recut.md +11 -0
- package/skills/hyperframes/references/skill-lifecycle.md +33 -0
- package/skills/hyperframes/references/workflow-catalog.md +10 -0
- package/skills/hyperframes-animation/SKILL.md +84 -0
- package/skills/hyperframes-animation/adapters/animate-text.md +64 -0
- package/skills/hyperframes-animation/adapters/animejs.md +130 -0
- package/skills/hyperframes-animation/adapters/css-animations.md +143 -0
- package/skills/hyperframes-animation/adapters/gsap-easing-and-stagger.md +199 -0
- package/skills/hyperframes-animation/adapters/gsap-timeline-and-labels.md +96 -0
- package/skills/hyperframes-animation/adapters/gsap-transforms-and-perf.md +129 -0
- package/skills/hyperframes-animation/adapters/gsap.md +105 -0
- package/skills/hyperframes-animation/adapters/html-in-canvas-patterns.md +507 -0
- package/skills/hyperframes-animation/adapters/lottie.md +117 -0
- package/skills/hyperframes-animation/adapters/three.md +131 -0
- package/skills/hyperframes-animation/adapters/typegpu.md +182 -0
- package/skills/hyperframes-animation/adapters/waapi.md +101 -0
- package/skills/hyperframes-animation/blueprints/agent-progress-theater.md +76 -0
- package/skills/hyperframes-animation/blueprints/camera-journey.md +61 -0
- package/skills/hyperframes-animation/blueprints/comparison-split.md +27 -0
- package/skills/hyperframes-animation/blueprints/constellation-hub.md +63 -0
- package/skills/hyperframes-animation/blueprints/cta-morph-press.md +63 -0
- package/skills/hyperframes-animation/blueprints/cursor-ui-demo.md +89 -0
- package/skills/hyperframes-animation/blueprints/dataviz-countup.md +59 -0
- package/skills/hyperframes-animation/blueprints/device-surface-showcase.md +68 -0
- package/skills/hyperframes-animation/blueprints/fixed-anchor-cycle.md +46 -0
- package/skills/hyperframes-animation/blueprints/grid-card-assemble.md +81 -0
- package/skills/hyperframes-animation/blueprints/kinetic-type-beats.md +133 -0
- package/skills/hyperframes-animation/blueprints/logo-assemble-lockup.md +121 -0
- package/skills/hyperframes-animation/blueprints/overwhelm-surround.md +58 -0
- package/skills/hyperframes-animation/blueprints/panel-edit-live-sync.md +73 -0
- package/skills/hyperframes-animation/blueprints/prompt-type-submit-generate.md +85 -0
- package/skills/hyperframes-animation/blueprints/spatial-pan-stations.md +37 -0
- package/skills/hyperframes-animation/blueprints/ticker-takeover.md +29 -0
- package/skills/hyperframes-animation/blueprints/titlecard-reveal.md +80 -0
- package/skills/hyperframes-animation/blueprints/transcript-scroll-artifact-reveal.md +45 -0
- package/skills/hyperframes-animation/blueprints/typewriter-reveal.md +51 -0
- package/skills/hyperframes-animation/blueprints/video-text-pivot.md +30 -0
- package/skills/hyperframes-animation/blueprints/zoom-out-workspace-reveal.md +68 -0
- package/skills/hyperframes-animation/blueprints-index.md +202 -0
- package/skills/hyperframes-animation/examples/brand-reveal-assemble-zoom.html +382 -0
- package/skills/hyperframes-animation/examples/comparison-split-cards.html +649 -0
- package/skills/hyperframes-animation/examples/concept-demo-decode-pan.html +520 -0
- package/skills/hyperframes-animation/examples/cta-morph-press.html +468 -0
- package/skills/hyperframes-animation/examples/cta-orbit-collapse.html +1298 -0
- package/skills/hyperframes-animation/examples/demo-page-scroll-spotlight.html +759 -0
- package/skills/hyperframes-animation/examples/hook-counter-burst.html +729 -0
- package/skills/hyperframes-animation/examples/messaging-multi-phrase.html +352 -0
- package/skills/hyperframes-animation/examples/metric-video-text-pivot.html +779 -0
- package/skills/hyperframes-animation/examples/problem-mockup-overwhelm.html +1374 -0
- package/skills/hyperframes-animation/examples/proof-logo-chain.html +861 -0
- package/skills/hyperframes-animation/examples/takeover-ticker-displace.html +347 -0
- package/skills/hyperframes-animation/examples/workflow-approve-press.html +606 -0
- package/skills/hyperframes-animation/rules/3d-camera-flight.md +180 -0
- package/skills/hyperframes-animation/rules/3d-page-scroll.md +135 -0
- package/skills/hyperframes-animation/rules/3d-text-depth-layers.md +128 -0
- package/skills/hyperframes-animation/rules/ai-tracking-box.md +139 -0
- package/skills/hyperframes-animation/rules/ambient-glow-bloom.md +133 -0
- package/skills/hyperframes-animation/rules/anchored-layout-expand.md +148 -0
- package/skills/hyperframes-animation/rules/asr-keyword-glow.md +128 -0
- package/skills/hyperframes-animation/rules/avatar-cloud-network.md +145 -0
- package/skills/hyperframes-animation/rules/camera-cursor-tracking.md +133 -0
- package/skills/hyperframes-animation/rules/card-morph-anchor.md +134 -0
- package/skills/hyperframes-animation/rules/center-outward-expansion.md +88 -0
- package/skills/hyperframes-animation/rules/chart-scrub-readout.md +151 -0
- package/skills/hyperframes-animation/rules/chromatic-glitch.md +150 -0
- package/skills/hyperframes-animation/rules/context-sensitive-cursor.md +140 -0
- package/skills/hyperframes-animation/rules/control-target-sync.md +131 -0
- package/skills/hyperframes-animation/rules/coordinate-target-zoom.md +138 -0
- package/skills/hyperframes-animation/rules/counting-dynamic-scale.md +115 -0
- package/skills/hyperframes-animation/rules/css-marker-patterns.md +208 -0
- package/skills/hyperframes-animation/rules/cursor-click-ripple.md +104 -0
- package/skills/hyperframes-animation/rules/cursor-drag.md +141 -0
- package/skills/hyperframes-animation/rules/depth-of-field-blur.md +112 -0
- package/skills/hyperframes-animation/rules/depth-scatter-assemble.md +139 -0
- package/skills/hyperframes-animation/rules/discrete-text-sequence.md +146 -0
- package/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +149 -0
- package/skills/hyperframes-animation/rules/gradient-text-sweep.md +136 -0
- package/skills/hyperframes-animation/rules/gsap-effects.md +196 -0
- package/skills/hyperframes-animation/rules/hacker-flip-3d.md +123 -0
- package/skills/hyperframes-animation/rules/kinetic-beat-slam.md +137 -0
- package/skills/hyperframes-animation/rules/motion-blur-streak.md +130 -0
- package/skills/hyperframes-animation/rules/multi-cursor-choreography.md +133 -0
- package/skills/hyperframes-animation/rules/multi-phase-camera.md +129 -0
- package/skills/hyperframes-animation/rules/nudge-curve.md +47 -0
- package/skills/hyperframes-animation/rules/orbit-3d-entry.md +148 -0
- package/skills/hyperframes-animation/rules/particle-burst.md +149 -0
- package/skills/hyperframes-animation/rules/physics-press-reaction.md +101 -0
- package/skills/hyperframes-animation/rules/press-release-spring.md +108 -0
- package/skills/hyperframes-animation/rules/reactive-displacement.md +92 -0
- package/skills/hyperframes-animation/rules/scale-swap-transition.md +88 -0
- package/skills/hyperframes-animation/rules/sine-wave-loop.md +85 -0
- package/skills/hyperframes-animation/rules/split-tilt-cards.md +123 -0
- package/skills/hyperframes-animation/rules/spring-pop-entrance.md +107 -0
- package/skills/hyperframes-animation/rules/stat-bars-and-fills.md +145 -0
- package/skills/hyperframes-animation/rules/svg-icon-enrichment.md +141 -0
- package/skills/hyperframes-animation/rules/svg-path-draw.md +122 -0
- package/skills/hyperframes-animation/rules/theme-crossfade-morph.md +126 -0
- package/skills/hyperframes-animation/rules/vertical-spring-ticker.md +104 -0
- package/skills/hyperframes-animation/rules/viewport-change.md +148 -0
- package/skills/hyperframes-animation/rules/waterfall-entry.md +81 -0
- package/skills/hyperframes-animation/rules-index.md +113 -0
- package/skills/hyperframes-animation/scripts/animation-map-sampling.mjs +40 -0
- package/skills/hyperframes-animation/scripts/animation-map-sampling.test.mjs +48 -0
- package/skills/{hyperframes → hyperframes-animation}/scripts/animation-map.mjs +116 -53
- package/skills/hyperframes-animation/scripts/animation-map.test.mjs +444 -0
- package/skills/hyperframes-animation/scripts/package-loader.mjs +384 -0
- package/skills/hyperframes-animation/scripts/package-loader.test.mjs +62 -0
- package/skills/{website-to-hyperframes/references → hyperframes-animation}/techniques.md +146 -26
- package/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +168 -0
- package/skills/{hyperframes/references → hyperframes-animation}/transitions/catalog.md +26 -16
- package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-destruction.md +1 -1
- package/skills/{hyperframes/references/transitions.md → hyperframes-animation/transitions/overview.md} +44 -3
- package/skills/hyperframes-audio/SKILL.md +470 -0
- package/skills/hyperframes-audio/references/attributes.md +138 -0
- package/skills/hyperframes-audio/references/diagnosis.md +276 -0
- package/skills/hyperframes-audio/references/fx-registry.md +84 -0
- package/skills/hyperframes-audio/references/presets.md +216 -0
- package/skills/hyperframes-audio/scripts/carve.mjs +569 -0
- package/skills/hyperframes-audio/scripts/carve.test.mjs +239 -0
- package/skills/hyperframes-cli/SKILL.md +121 -103
- package/skills/hyperframes-cli/references/beats.md +19 -0
- package/skills/hyperframes-cli/references/cloud.md +163 -0
- package/skills/hyperframes-cli/references/cloudrun.md +62 -0
- package/skills/hyperframes-cli/references/compare-and-batch.md +105 -0
- package/skills/hyperframes-cli/references/doctor-browser.md +57 -0
- package/skills/hyperframes-cli/references/init-and-scaffold.md +72 -0
- package/skills/hyperframes-cli/references/lambda.md +185 -0
- package/skills/hyperframes-cli/references/lint-validate-inspect.md +132 -0
- package/skills/hyperframes-cli/references/preview-render.md +190 -0
- package/skills/hyperframes-cli/references/upgrade-info-misc.md +77 -0
- package/skills/hyperframes-core/SKILL.md +94 -0
- package/skills/hyperframes-core/references/brief-contract.md +108 -0
- package/skills/hyperframes-core/references/brief-format.md +72 -0
- package/skills/hyperframes-core/references/composition-patterns.md +263 -0
- package/skills/hyperframes-core/references/creator-editing-recipes.md +367 -0
- package/skills/hyperframes-core/references/data-attributes.md +78 -0
- package/skills/hyperframes-core/references/determinism-rules.md +70 -0
- package/skills/hyperframes-core/references/frame-worker-core.md +80 -0
- package/skills/hyperframes-core/references/full-screen-motion.md +76 -0
- package/skills/hyperframes-core/references/minimal-composition.md +69 -0
- package/skills/hyperframes-core/references/production-loop.md +26 -0
- package/skills/hyperframes-core/references/review-loop.md +41 -0
- package/skills/hyperframes-core/references/script-format.md +52 -0
- package/skills/hyperframes-core/references/storyboard-format.md +130 -0
- package/skills/hyperframes-core/references/sub-compositions.md +239 -0
- package/skills/hyperframes-core/references/subagent-dispatch.md +35 -0
- package/skills/hyperframes-core/references/tailwind.md +123 -0
- package/skills/hyperframes-core/references/tracks-and-clips.md +91 -0
- package/skills/hyperframes-core/references/variables-and-media.md +107 -0
- package/skills/hyperframes-core/scripts/lib/frame-packets-core.mjs +212 -0
- package/skills/hyperframes-creative/SKILL.md +71 -0
- package/skills/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md +289 -0
- package/skills/hyperframes-creative/frame-presets/biennale-yellow/caption-skin.html +221 -0
- package/skills/hyperframes-creative/frame-presets/biennale-yellow/frame-showcase.html +1214 -0
- package/skills/hyperframes-creative/frame-presets/blockframe/FRAME.md +275 -0
- package/skills/hyperframes-creative/frame-presets/blockframe/caption-skin.html +224 -0
- package/skills/hyperframes-creative/frame-presets/blockframe/frame-showcase.html +1347 -0
- package/skills/hyperframes-creative/frame-presets/blue-professional/FRAME.md +307 -0
- package/skills/hyperframes-creative/frame-presets/blue-professional/caption-skin.html +223 -0
- package/skills/hyperframes-creative/frame-presets/blue-professional/frame-showcase.html +1372 -0
- package/skills/hyperframes-creative/frame-presets/bold-poster/FRAME.md +275 -0
- package/skills/hyperframes-creative/frame-presets/bold-poster/caption-skin.html +230 -0
- package/skills/hyperframes-creative/frame-presets/bold-poster/frame-showcase.html +1140 -0
- package/skills/hyperframes-creative/frame-presets/broadside/FRAME.md +284 -0
- package/skills/hyperframes-creative/frame-presets/broadside/caption-skin.html +225 -0
- package/skills/hyperframes-creative/frame-presets/broadside/frame-showcase.html +1166 -0
- package/skills/hyperframes-creative/frame-presets/capsule/FRAME.md +284 -0
- package/skills/hyperframes-creative/frame-presets/capsule/caption-skin.html +224 -0
- package/skills/hyperframes-creative/frame-presets/capsule/frame-showcase.html +1465 -0
- package/skills/hyperframes-creative/frame-presets/cartesian/FRAME.md +278 -0
- package/skills/hyperframes-creative/frame-presets/cartesian/caption-skin.html +222 -0
- package/skills/hyperframes-creative/frame-presets/cartesian/frame-showcase.html +1263 -0
- package/skills/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md +265 -0
- package/skills/hyperframes-creative/frame-presets/cobalt-grid/caption-skin.html +238 -0
- package/skills/hyperframes-creative/frame-presets/cobalt-grid/frame-showcase.html +1468 -0
- package/skills/hyperframes-creative/frame-presets/code-editorial/FRAME.md +277 -0
- package/skills/hyperframes-creative/frame-presets/code-editorial/caption-skin.html +224 -0
- package/skills/hyperframes-creative/frame-presets/code-editorial/fonts/EBGaramond-400.woff2 +0 -0
- package/skills/hyperframes-creative/frame-presets/code-editorial/fonts/EBGaramond-700.woff2 +0 -0
- package/skills/hyperframes-creative/frame-presets/code-editorial/fonts/Inter-400.woff2 +0 -0
- package/skills/hyperframes-creative/frame-presets/code-editorial/fonts/Inter-700.woff2 +0 -0
- package/skills/hyperframes-creative/frame-presets/code-editorial/fonts/JetBrainsMono-400.woff2 +0 -0
- package/skills/hyperframes-creative/frame-presets/code-editorial/fonts/JetBrainsMono-700.woff2 +0 -0
- package/skills/hyperframes-creative/frame-presets/code-editorial/fonts/OFL-eb-garamond.txt +93 -0
- package/skills/hyperframes-creative/frame-presets/code-editorial/fonts/OFL-inter.txt +93 -0
- package/skills/hyperframes-creative/frame-presets/code-editorial/fonts/OFL-jetbrains-mono.txt +93 -0
- package/skills/hyperframes-creative/frame-presets/code-editorial/frame-showcase.html +1438 -0
- package/skills/hyperframes-creative/frame-presets/coral/FRAME.md +314 -0
- package/skills/hyperframes-creative/frame-presets/coral/caption-skin.html +226 -0
- package/skills/hyperframes-creative/frame-presets/coral/frame-showcase.html +1268 -0
- package/skills/hyperframes-creative/frame-presets/creative-mode/FRAME.md +333 -0
- package/skills/hyperframes-creative/frame-presets/creative-mode/caption-skin.html +227 -0
- package/skills/hyperframes-creative/frame-presets/creative-mode/frame-showcase.html +1330 -0
- package/skills/hyperframes-creative/frame-presets/daisy-days/FRAME.md +274 -0
- package/skills/hyperframes-creative/frame-presets/daisy-days/caption-skin.html +230 -0
- package/skills/hyperframes-creative/frame-presets/daisy-days/frame-showcase.html +1444 -0
- package/skills/hyperframes-creative/frame-presets/editorial-forest/FRAME.md +265 -0
- package/skills/hyperframes-creative/frame-presets/editorial-forest/caption-skin.html +223 -0
- package/skills/hyperframes-creative/frame-presets/editorial-forest/frame-showcase.html +1273 -0
- package/skills/{hyperframes → hyperframes-creative}/references/audio-reactive.md +1 -1
- package/skills/hyperframes-creative/references/beat-direction.md +164 -0
- package/skills/hyperframes-creative/references/composition-patterns.md +199 -0
- package/skills/{hyperframes → hyperframes-creative/references}/data-in-motion.md +1 -1
- package/skills/hyperframes-creative/references/design-adherence.md +19 -0
- package/skills/hyperframes-creative/references/design-picker.md +123 -0
- package/skills/hyperframes-creative/references/design-spec.md +55 -0
- package/skills/{hyperframes → hyperframes-creative/references}/house-style.md +4 -2
- package/skills/hyperframes-creative/references/motion-principles.md +151 -0
- package/skills/{website-to-hyperframes/references/step-3-script.md → hyperframes-creative/references/narration.md} +5 -9
- package/skills/hyperframes-creative/references/prompt-expansion.md +68 -0
- package/skills/hyperframes-creative/references/story-spine.md +43 -0
- package/skills/{hyperframes → hyperframes-creative}/references/typography.md +45 -2
- package/skills/hyperframes-creative/references/video-composition.md +63 -0
- package/skills/hyperframes-creative/references/visual-styles.md +457 -0
- package/skills/hyperframes-creative/scripts/contrast-report.mjs +538 -0
- package/skills/{gsap → hyperframes-creative}/scripts/extract-audio-data.py +13 -2
- package/skills/hyperframes-creative/scripts/package-loader.mjs +384 -0
- package/skills/hyperframes-creative/scripts/package-loader.test.mjs +62 -0
- package/skills/hyperframes-creative/templates/design-picker.html +1432 -0
- package/skills/hyperframes-keyframes/SKILL.md +262 -0
- package/skills/hyperframes-keyframes/agents/openai.yaml +4 -0
- package/skills/hyperframes-keyframes/references/keyframe-patterns.md +108 -0
- package/skills/hyperframes-registry/SKILL.md +55 -16
- package/skills/hyperframes-registry/references/component-quality-bar.md +250 -0
- package/skills/hyperframes-registry/references/contributing.md +174 -0
- package/skills/hyperframes-registry/references/discovery.md +191 -13
- package/skills/hyperframes-registry/references/placeholder-material.md +149 -0
- package/skills/hyperframes-registry/references/templates.md +417 -0
- package/skills/hyperframes-registry/references/wiring-blocks.md +1 -31
- package/skills/hyperframes-registry/references/wiring-components.md +1 -39
- package/skills/media-use/SKILL.md +96 -0
- package/skills/media-use/audio/assets/sfx/CREDITS.md +35 -0
- package/skills/media-use/audio/assets/sfx/chime.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/click-soft.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/click.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/error.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/glitch-1.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/glitch-2.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/glitch-3.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/impact-bass-1.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/impact-bass-2.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/key-press.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/manifest.json +97 -0
- package/skills/media-use/audio/assets/sfx/notification.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/ping.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/pop.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/riser.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/sparkle.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/typing.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/whoosh-cinematic.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/whoosh-short.mp3 +0 -0
- package/skills/media-use/audio/assets/sfx/whoosh.mp3 +0 -0
- package/skills/media-use/audio/references/bgm.md +74 -0
- package/skills/media-use/audio/references/captions/authoring.md +159 -0
- package/skills/{hyperframes/references/dynamic-techniques.md → media-use/audio/references/captions/motion.md} +8 -11
- package/skills/{hyperframes/references/transcript-guide.md → media-use/audio/references/captions/transcript-handling.md} +5 -59
- package/skills/media-use/audio/references/remove-background.md +143 -0
- package/skills/media-use/audio/references/requirements.md +29 -0
- package/skills/media-use/audio/references/sfx.md +42 -0
- package/skills/media-use/audio/references/transcribe.md +52 -0
- package/skills/media-use/audio/references/tts-to-captions.md +26 -0
- package/skills/media-use/audio/references/tts.md +165 -0
- package/skills/media-use/audio/scripts/audio.mjs +293 -0
- package/skills/media-use/audio/scripts/audio.test.mjs +49 -0
- package/skills/media-use/audio/scripts/heygen-tts.mjs +121 -0
- package/skills/media-use/audio/scripts/lib/bgm.mjs +257 -0
- package/skills/media-use/audio/scripts/lib/bgm.test.mjs +30 -0
- package/skills/media-use/audio/scripts/lib/concurrency.mjs +14 -0
- package/skills/media-use/audio/scripts/lib/concurrency.test.mjs +41 -0
- package/skills/media-use/audio/scripts/lib/heygen.mjs +155 -0
- package/skills/media-use/audio/scripts/lib/heygen.test.mjs +103 -0
- package/skills/media-use/audio/scripts/lib/python.mjs +63 -0
- package/skills/media-use/audio/scripts/lib/python.test.mjs +68 -0
- package/skills/media-use/audio/scripts/lib/sfx.mjs +143 -0
- package/skills/media-use/audio/scripts/lib/sfx.test.mjs +69 -0
- package/skills/media-use/audio/scripts/lib/tts.mjs +378 -0
- package/skills/media-use/audio/scripts/lib/tts.spawn.test.mjs +158 -0
- package/skills/media-use/audio/scripts/lib/tts.test.mjs +157 -0
- package/skills/media-use/audio/scripts/lyria-recipe.py +136 -0
- package/skills/media-use/audio/scripts/wait-bgm.mjs +167 -0
- package/skills/media-use/luts/README.md +28 -0
- package/skills/media-use/luts/index.json +57 -0
- package/skills/media-use/references/audio.md +19 -0
- package/skills/media-use/references/grading.md +160 -0
- package/skills/media-use/references/media-treatment-recipes.md +929 -0
- package/skills/media-use/references/media-treatments.md +202 -0
- package/skills/media-use/references/memory.md +36 -0
- package/skills/media-use/references/meta.md +61 -0
- package/skills/media-use/references/operations.md +325 -0
- package/skills/media-use/references/resolve.md +139 -0
- package/skills/media-use/references/setup-providers.md +80 -0
- package/skills/media-use/references/telemetry-dashboard.md +49 -0
- package/skills/media-use/scripts/audio-duck.mjs +121 -0
- package/skills/media-use/scripts/dither.mjs +328 -0
- package/skills/media-use/scripts/dither.test.mjs +176 -0
- package/skills/media-use/scripts/eval.mjs +369 -0
- package/skills/media-use/scripts/lib/adopt.mjs +128 -0
- package/skills/media-use/scripts/lib/adopt.test.mjs +95 -0
- package/skills/media-use/scripts/lib/bgm-provider.mjs +20 -0
- package/skills/media-use/scripts/lib/brand-provider.mjs +59 -0
- package/skills/media-use/scripts/lib/bundled-sfx-provider.mjs +108 -0
- package/skills/media-use/scripts/lib/bundled-sfx-provider.test.mjs +85 -0
- package/skills/media-use/scripts/lib/cache.mjs +150 -0
- package/skills/media-use/scripts/lib/candidates.mjs +91 -0
- package/skills/media-use/scripts/lib/candidates.test.mjs +155 -0
- package/skills/media-use/scripts/lib/codex-provider.mjs +161 -0
- package/skills/media-use/scripts/lib/codex-provider.test.mjs +34 -0
- package/skills/media-use/scripts/lib/coverage.test.mjs +117 -0
- package/skills/media-use/scripts/lib/cube-build.mjs +181 -0
- package/skills/media-use/scripts/lib/cube-build.test.mjs +80 -0
- package/skills/media-use/scripts/lib/cube-validate.mjs +198 -0
- package/skills/media-use/scripts/lib/cube-validate.test.mjs +125 -0
- package/skills/media-use/scripts/lib/cutlist.mjs +184 -0
- package/skills/media-use/scripts/lib/cutlist.test.mjs +148 -0
- package/skills/media-use/scripts/lib/duck.mjs +89 -0
- package/skills/media-use/scripts/lib/duck.test.mjs +118 -0
- package/skills/media-use/scripts/lib/error-diffusion.mjs +230 -0
- package/skills/media-use/scripts/lib/error-diffusion.test.mjs +102 -0
- package/skills/media-use/scripts/lib/freeze.mjs +70 -0
- package/skills/media-use/scripts/lib/freeze.test.mjs +46 -0
- package/skills/media-use/scripts/lib/grade-analyzer.mjs +264 -0
- package/skills/media-use/scripts/lib/grade-analyzer.test.mjs +285 -0
- package/skills/media-use/scripts/lib/heygen-cli.mjs +191 -0
- package/skills/media-use/scripts/lib/heygen-cli.test.mjs +301 -0
- package/skills/media-use/scripts/lib/heygen-search.mjs +45 -0
- package/skills/media-use/scripts/lib/heygen-search.test.mjs +49 -0
- package/skills/media-use/scripts/lib/heygen-video-provider.mjs +127 -0
- package/skills/media-use/scripts/lib/heygen-video-provider.test.mjs +344 -0
- package/skills/media-use/scripts/lib/image-provider.mjs +44 -0
- package/skills/media-use/scripts/lib/index-gen.mjs +63 -0
- package/skills/media-use/scripts/lib/local-models.mjs +318 -0
- package/skills/media-use/scripts/lib/local-models.test.mjs +220 -0
- package/skills/media-use/scripts/lib/local-run.mjs +78 -0
- package/skills/media-use/scripts/lib/local-run.test.mjs +121 -0
- package/skills/media-use/scripts/lib/logo-provider.mjs +222 -0
- package/skills/media-use/scripts/lib/logo-provider.test.mjs +137 -0
- package/skills/media-use/scripts/lib/ltx-video-provider.mjs +94 -0
- package/skills/media-use/scripts/lib/ltx-video-provider.test.mjs +316 -0
- package/skills/media-use/scripts/lib/lut-preset-provider.mjs +266 -0
- package/skills/media-use/scripts/lib/lut-preset-provider.test.mjs +176 -0
- package/skills/media-use/scripts/lib/manifest.mjs +229 -0
- package/skills/media-use/scripts/lib/manifest.test.mjs +388 -0
- package/skills/media-use/scripts/lib/match.mjs +47 -0
- package/skills/media-use/scripts/lib/mflux-provider.mjs +128 -0
- package/skills/media-use/scripts/lib/mflux-provider.test.mjs +174 -0
- package/skills/media-use/scripts/lib/misses.mjs +49 -0
- package/skills/media-use/scripts/lib/misses.test.mjs +78 -0
- package/skills/media-use/scripts/lib/npx-sync.mjs +31 -0
- package/skills/media-use/scripts/lib/npx-sync.test.mjs +50 -0
- package/skills/media-use/scripts/lib/parakeet-words.mjs +27 -0
- package/skills/media-use/scripts/lib/parakeet-words.test.mjs +44 -0
- package/skills/media-use/scripts/lib/prefs-store.mjs +180 -0
- package/skills/media-use/scripts/lib/prefs-store.test.mjs +189 -0
- package/skills/media-use/scripts/lib/probe.mjs +39 -0
- package/skills/media-use/scripts/lib/probe.test.mjs +31 -0
- package/skills/media-use/scripts/lib/providers.mjs +5 -0
- package/skills/media-use/scripts/lib/recipe-store.mjs +367 -0
- package/skills/media-use/scripts/lib/recipe-store.test.mjs +367 -0
- package/skills/media-use/scripts/lib/registry.mjs +218 -0
- package/skills/media-use/scripts/lib/registry.test.mjs +261 -0
- package/skills/media-use/scripts/lib/search.mjs +24 -0
- package/skills/media-use/scripts/lib/search.test.mjs +32 -0
- package/skills/media-use/scripts/lib/sfx-provider.mjs +23 -0
- package/skills/media-use/scripts/lib/specs.mjs +132 -0
- package/skills/media-use/scripts/lib/specs.test.mjs +157 -0
- package/skills/media-use/scripts/lib/stats.mjs +117 -0
- package/skills/media-use/scripts/lib/stats.test.mjs +165 -0
- package/skills/media-use/scripts/lib/telemetry.mjs +222 -0
- package/skills/media-use/scripts/lib/telemetry.test.mjs +373 -0
- package/skills/media-use/scripts/lib/tts-local-provider.mjs +92 -0
- package/skills/media-use/scripts/lib/tts-local-provider.test.mjs +72 -0
- package/skills/media-use/scripts/lib/usage.mjs +57 -0
- package/skills/media-use/scripts/lib/usage.test.mjs +54 -0
- package/skills/media-use/scripts/lib/voice-provider.mjs +57 -0
- package/skills/media-use/scripts/lib/voice-provider.test.mjs +46 -0
- package/skills/media-use/scripts/lib/words.mjs +18 -0
- package/skills/media-use/scripts/prefs.mjs +70 -0
- package/skills/media-use/scripts/recipe.mjs +103 -0
- package/skills/media-use/scripts/resolve.mjs +1271 -0
- package/skills/media-use/scripts/resolve.test.mjs +1120 -0
- package/skills/media-use/scripts/transcribe.mjs +180 -0
- package/skills/media-use/scripts/transcript-cut.mjs +239 -0
- package/skills/motion-graphics/SKILL.md +176 -0
- package/skills/motion-graphics/agents/builder.md +40 -0
- package/skills/motion-graphics/agents/director.md +53 -0
- package/skills/motion-graphics/agents/finalize.md +17 -0
- package/skills/motion-graphics/catalog-map.md +40 -0
- package/skills/motion-graphics/categories/asset-fusion/module.md +37 -0
- package/skills/motion-graphics/categories/charts/module.md +21 -0
- package/skills/motion-graphics/categories/kinetic-type/module.md +19 -0
- package/skills/motion-graphics/categories/logo-reveal/module.md +17 -0
- package/skills/motion-graphics/categories/lower-thirds/module.md +16 -0
- package/skills/motion-graphics/categories/maps/bake-basemap.mjs +273 -0
- package/skills/motion-graphics/categories/maps/module.md +61 -0
- package/skills/motion-graphics/categories/news/module.md +56 -0
- package/skills/motion-graphics/categories/stat/module.md +21 -0
- package/skills/motion-graphics/categories/tweet/module.md +16 -0
- package/skills/motion-graphics/categories/webpage/module.md +30 -0
- package/skills/motion-graphics/grounding/PROTOCOL.md +64 -0
- package/skills/motion-graphics/grounding/locate.mjs +228 -0
- package/skills/motion-graphics/phases/source/guide.md +21 -0
- package/skills/motion-graphics/references/builder-contract.md +38 -0
- package/skills/motion-graphics/references/motion-vocabulary.md +43 -0
- package/skills/motion-graphics/references/shot-plan-ir.md +54 -0
- package/skills/motion-graphics/samples/asset-fusion/_ref-circle-highlight.html +306 -0
- package/skills/music-to-video/SKILL.md +208 -0
- package/skills/music-to-video/references/frame-skeleton.md +100 -0
- package/skills/music-to-video/references/montage.md +58 -0
- package/skills/music-to-video/references/motion-primitive-catalog.md +75 -0
- package/skills/music-to-video/references/motion-primitives/3d-card-flip/index.html +154 -0
- package/skills/music-to-video/references/motion-primitives/assets/gsap.min.js +11 -0
- package/skills/music-to-video/references/motion-primitives/bg-flow-field/index.html +326 -0
- package/skills/music-to-video/references/motion-primitives/binary-decrypt/index.html +120 -0
- package/skills/music-to-video/references/motion-primitives/blur-resolve/index.html +95 -0
- package/skills/music-to-video/references/motion-primitives/braam-punch/index.html +135 -0
- package/skills/music-to-video/references/motion-primitives/chromatic-split/index.html +146 -0
- package/skills/music-to-video/references/motion-primitives/chrome-sweep/index.html +103 -0
- package/skills/music-to-video/references/motion-primitives/counting-punch/index.html +154 -0
- package/skills/music-to-video/references/motion-primitives/crash-zoom-in/index.html +155 -0
- package/skills/music-to-video/references/motion-primitives/datamosh-smear/index.html +166 -0
- package/skills/music-to-video/references/motion-primitives/directional-fill/index.html +133 -0
- package/skills/music-to-video/references/motion-primitives/dolly-zoom/index.html +137 -0
- package/skills/music-to-video/references/motion-primitives/electric-arc/index.html +144 -0
- package/skills/music-to-video/references/motion-primitives/flash-cut/index.html +132 -0
- package/skills/music-to-video/references/motion-primitives/gooey-metaball/index.html +241 -0
- package/skills/music-to-video/references/motion-primitives/hard-cut/index.html +117 -0
- package/skills/music-to-video/references/motion-primitives/hypercut-whip/index.html +79 -0
- package/skills/music-to-video/references/motion-primitives/iris-open/index.html +104 -0
- package/skills/music-to-video/references/motion-primitives/kinetic-letter-in/index.html +98 -0
- package/skills/music-to-video/references/motion-primitives/liquid-morph/index.html +131 -0
- package/skills/music-to-video/references/motion-primitives/mask-reveal/index.html +109 -0
- package/skills/music-to-video/references/motion-primitives/mosaic-pack/index.html +124 -0
- package/skills/music-to-video/references/motion-primitives/neon-flicker/index.html +108 -0
- package/skills/music-to-video/references/motion-primitives/outline-to-fill/index.html +117 -0
- package/skills/music-to-video/references/motion-primitives/palette-flip/index.html +132 -0
- package/skills/music-to-video/references/motion-primitives/particle-burst/index.html +141 -0
- package/skills/music-to-video/references/motion-primitives/pixel-dissolve/index.html +121 -0
- package/skills/music-to-video/references/motion-primitives/radial-burst-lines/index.html +160 -0
- package/skills/music-to-video/references/motion-primitives/screen-shake/index.html +113 -0
- package/skills/music-to-video/references/motion-primitives/slot-machine-reveal/index.html +130 -0
- package/skills/music-to-video/references/motion-primitives/spotlight-sweep/index.html +137 -0
- package/skills/music-to-video/references/motion-primitives/staggered-exit/index.html +117 -0
- package/skills/music-to-video/references/motion-primitives/text-spectral-rays/USAGE.md +42 -0
- package/skills/music-to-video/references/motion-primitives/text-spectral-rays/index.html +313 -0
- package/skills/music-to-video/references/motion-primitives/text-wave-distort/index.html +136 -0
- package/skills/music-to-video/references/motion-primitives/tile-mosaic/index.html +144 -0
- package/skills/music-to-video/references/motion-primitives/typewriter-reveal/index.html +122 -0
- package/skills/music-to-video/references/motion-primitives/word-grid-burst/index.html +126 -0
- package/skills/music-to-video/references/planning.md +104 -0
- package/skills/music-to-video/references/storyboard-format.md +94 -0
- package/skills/music-to-video/references/template-catalog.md +106 -0
- package/skills/music-to-video/references/templates/card-flyby/index.html +527 -0
- package/skills/music-to-video/references/templates/card-flyby/program.json +13 -0
- package/skills/music-to-video/references/templates/held-message-living-field/index.html +485 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/asphalt-031.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bark-014.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/brick.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-075-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-101.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-102.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-104.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/carpet.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-034.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-042-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-046.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-047-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/diamond-plate-009.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/fabric-080.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/fabric-083.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/grass-001.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/grass-004.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/grass-005.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-037.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-054.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-068.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-080.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-103.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-104.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/lava.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/leather-037.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/marble-012.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/marble-016.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-032.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-038.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-041-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-046-b.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-048-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-049-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-055-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-061-b.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/onyx.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/painted-plaster-017.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/paving-stones-138.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/paving-stones-150.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/plaster-001.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-007.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-008-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-009-c.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-012-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-012-b.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-013-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/rock-058.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/rock-063.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/rock.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/snow-015.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/snow.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/tiles-138.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/travertine-009.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-049.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-051.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-058.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-066.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-092.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-094.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-floor-051.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-floor-064.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-floor-070.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/index.html +302 -0
- package/skills/music-to-video/references/templates/intro-kinetic-cascade/index.html +610 -0
- package/skills/music-to-video/references/templates/intro-kinetic-cascade/program.json +41 -0
- package/skills/music-to-video/references/templates/logo-split-lockup-pulse/assets/fredoka-700.woff2 +0 -0
- package/skills/music-to-video/references/templates/logo-split-lockup-pulse/index.html +596 -0
- package/skills/music-to-video/references/templates/poster-tile-mosaic/index.html +589 -0
- package/skills/music-to-video/references/templates/poster-tile-mosaic/program.json +25 -0
- package/skills/music-to-video/references/templates/roll-flipbook-word-cycle/index.html +267 -0
- package/skills/music-to-video/references/templates/split-anchor-word-slot/index.html +594 -0
- package/skills/music-to-video/references/templates/split-anchor-word-slot/program.json +39 -0
- package/skills/music-to-video/references/templates/typewriter-phrase-keyword-shuffle/index.html +238 -0
- package/skills/music-to-video/scripts/analyze-beatgrid.py +542 -0
- package/skills/music-to-video/scripts/assemble-index.mjs +220 -0
- package/skills/music-to-video/scripts/lib/storyboard.mjs +249 -0
- package/skills/music-to-video/scripts/stage-assets.mjs +58 -0
- package/skills/music-to-video/scripts/validate-plan.mjs +161 -0
- package/skills/music-to-video/sub-agents/frame-worker.md +49 -0
- package/skills/pr-to-video/SKILL.md +269 -0
- package/skills/pr-to-video/references/code-vocabulary.md +111 -0
- package/skills/pr-to-video/references/cut-catalog.md +215 -0
- package/skills/pr-to-video/references/motion-language.md +156 -0
- package/skills/pr-to-video/references/story-design.md +230 -0
- package/skills/pr-to-video/references/visual-design.md +164 -0
- package/skills/pr-to-video/scripts/assemble-index.mjs +629 -0
- package/skills/pr-to-video/scripts/assemble-index.test.mjs +75 -0
- package/skills/pr-to-video/scripts/audio.mjs +291 -0
- package/skills/pr-to-video/scripts/build-frame.mjs +586 -0
- package/skills/pr-to-video/scripts/captions.mjs +521 -0
- package/skills/pr-to-video/scripts/captions.test.mjs +219 -0
- package/skills/pr-to-video/scripts/fetch-people-avatars.mjs +157 -0
- package/skills/pr-to-video/scripts/fetch-pr.mjs +234 -0
- package/skills/pr-to-video/scripts/frame-contract.test.mjs +209 -0
- package/skills/pr-to-video/scripts/frame-packets.mjs +62 -0
- package/skills/pr-to-video/scripts/ingest.mjs +561 -0
- package/skills/pr-to-video/scripts/lib/assets.mjs +56 -0
- package/skills/pr-to-video/scripts/lib/dimensions.mjs +45 -0
- package/skills/pr-to-video/scripts/lib/frame-contract.mjs +54 -0
- package/skills/pr-to-video/scripts/lib/pad-frame-duration.mjs +36 -0
- package/skills/pr-to-video/scripts/lib/storyboard.mjs +249 -0
- package/skills/pr-to-video/scripts/lib/tokens.mjs +211 -0
- package/skills/pr-to-video/scripts/lib/transition-registry.mjs +38 -0
- package/skills/pr-to-video/scripts/lib/transitions.json +71 -0
- package/skills/pr-to-video/scripts/preflight.mjs +51 -0
- package/skills/pr-to-video/scripts/project-dir.mjs +92 -0
- package/skills/pr-to-video/scripts/transitions.mjs +381 -0
- package/skills/pr-to-video/scripts/workflow-guardrails.test.mjs +198 -0
- package/skills/pr-to-video/sub-agents/frame-worker.md +38 -0
- package/skills/product-launch-video/SKILL.md +260 -0
- package/skills/product-launch-video/references/cut-catalog.md +220 -0
- package/skills/product-launch-video/references/motion-language.md +156 -0
- package/skills/product-launch-video/references/story-design.md +508 -0
- package/skills/product-launch-video/references/visual-design.md +126 -0
- package/skills/product-launch-video/scripts/assemble-index.mjs +771 -0
- package/skills/product-launch-video/scripts/assemble-index.test.mjs +72 -0
- package/skills/product-launch-video/scripts/audio.mjs +291 -0
- package/skills/product-launch-video/scripts/audio.test.mjs +218 -0
- package/skills/product-launch-video/scripts/build-frame.mjs +549 -0
- package/skills/product-launch-video/scripts/captions.mjs +521 -0
- package/skills/product-launch-video/scripts/captions.test.mjs +219 -0
- package/skills/product-launch-video/scripts/capture-skill-guardrails.test.mjs +39 -0
- package/skills/product-launch-video/scripts/frame-packets.mjs +27 -0
- package/skills/product-launch-video/scripts/frame-packets.test.mjs +144 -0
- package/skills/product-launch-video/scripts/lib/assets.mjs +56 -0
- package/skills/product-launch-video/scripts/lib/dimensions.mjs +45 -0
- package/skills/product-launch-video/scripts/lib/pad-frame-duration.mjs +36 -0
- package/skills/product-launch-video/scripts/lib/pad-frame-duration.test.mjs +76 -0
- package/skills/product-launch-video/scripts/lib/storyboard.mjs +249 -0
- package/skills/product-launch-video/scripts/lib/tokens.mjs +218 -0
- package/skills/product-launch-video/scripts/lib/tokens.test.mjs +57 -0
- package/skills/product-launch-video/scripts/lib/transition-registry.mjs +38 -0
- package/skills/product-launch-video/scripts/lib/transitions.json +71 -0
- package/skills/product-launch-video/scripts/media-contract.test.mjs +200 -0
- package/skills/product-launch-video/scripts/stage-assets.mjs +39 -0
- package/skills/product-launch-video/scripts/stage-assets.test.mjs +52 -0
- package/skills/product-launch-video/scripts/transitions.mjs +381 -0
- package/skills/product-launch-video/sub-agents/frame-worker.md +21 -0
- package/skills/remotion-to-hyperframes/SKILL.md +129 -0
- package/skills/remotion-to-hyperframes/assets/.gitkeep +0 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/run.sh +249 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/README.md +41 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/expected.json +26 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/hf-src/index.html +61 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/package.json +14 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/remotion.config.ts +13 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/src/Root.tsx +13 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/src/TitleCard.tsx +34 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/src/index.ts +4 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/tsconfig.json +15 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/README.md +54 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/expected.json +29 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/index.html +118 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/package.json +14 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/remotion.config.ts +13 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/src/MultiScene.tsx +105 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/src/Root.tsx +13 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/src/index.ts +4 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/tsconfig.json +15 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/setup.sh +34 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/README.md +85 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/expected.json +41 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/index.html +269 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/package.json +15 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/remotion.config.ts +13 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/Root.tsx +27 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/Stargazed.tsx +37 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/components/AnimatedNumber.tsx +23 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/components/StatCard.tsx +59 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/components/UnderlinedText.tsx +47 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/index.ts +4 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/scenes/OutroScene.tsx +18 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/scenes/StatsScene.tsx +34 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/scenes/TitleScene.tsx +55 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/tsconfig.json +15 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/README.md +51 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/01-use-state.tsx +29 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/02-use-effect-deps.tsx +29 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/03-async-metadata.tsx +39 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/04-third-party-react.tsx +30 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/05-lambda-config.tsx +38 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/06-warnings-only.tsx +36 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/07-custom-hook.tsx +28 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/08-mixed.tsx +41 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/expected.json +85 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/validate.sh +110 -0
- package/skills/remotion-to-hyperframes/references/api-map.md +142 -0
- package/skills/remotion-to-hyperframes/references/escape-hatch.md +115 -0
- package/skills/remotion-to-hyperframes/references/eval.md +140 -0
- package/skills/remotion-to-hyperframes/references/fonts.md +112 -0
- package/skills/remotion-to-hyperframes/references/limitations.md +136 -0
- package/skills/remotion-to-hyperframes/references/lottie.md +121 -0
- package/skills/remotion-to-hyperframes/references/media.md +149 -0
- package/skills/remotion-to-hyperframes/references/parameters.md +167 -0
- package/skills/remotion-to-hyperframes/references/sequencing.md +198 -0
- package/skills/remotion-to-hyperframes/references/timing.md +165 -0
- package/skills/remotion-to-hyperframes/references/transitions.md +114 -0
- package/skills/remotion-to-hyperframes/scripts/.gitkeep +0 -0
- package/skills/remotion-to-hyperframes/scripts/frame_strip.sh +107 -0
- package/skills/remotion-to-hyperframes/scripts/lint_source.py +370 -0
- package/skills/remotion-to-hyperframes/scripts/render_diff.sh +103 -0
- package/skills/remotion-to-hyperframes/scripts/tests/fixtures/blocker.tsx +50 -0
- package/skills/remotion-to-hyperframes/scripts/tests/fixtures/clean.tsx +46 -0
- package/skills/remotion-to-hyperframes/scripts/tests/smoke.sh +90 -0
- package/skills/slideshow/SKILL.md +529 -0
- package/skills/slideshow/references/standalone-harness.md +1020 -0
- package/skills/talking-head-recut/NOTICE.md +39 -0
- package/skills/talking-head-recut/SKILL.md +1211 -0
- package/skills/talking-head-recut/assets/fonts/Caveat-400-latin.woff2 +0 -0
- package/skills/talking-head-recut/assets/fonts/Caveat-700-latin.woff2 +0 -0
- package/skills/talking-head-recut/assets/fonts/Inter-400-latin.woff2 +0 -0
- package/skills/talking-head-recut/assets/fonts/Inter-700-latin.woff2 +0 -0
- package/skills/talking-head-recut/assets/fonts/LXGWWenKaiTC-400-latin.woff2 +0 -0
- package/skills/talking-head-recut/assets/fonts/Virgil.woff2 +0 -0
- package/skills/talking-head-recut/assets/vendor/gsap.min.js +10 -0
- package/skills/talking-head-recut/media-contract.test.mjs +35 -0
- package/skills/talking-head-recut/references/DESIGN_INDEX.md +145 -0
- package/skills/talking-head-recut/references/frames/clean.html +92 -0
- package/skills/talking-head-recut/references/frames/hairline.html +171 -0
- package/skills/talking-head-recut/references/frames/polaroid.html +131 -0
- package/skills/talking-head-recut/references/layouts/overlay.html +164 -0
- package/skills/talking-head-recut/references/layouts/pip.html +143 -0
- package/skills/talking-head-recut/references/layouts/split.html +121 -0
- package/skills/talking-head-recut/references/layouts/stack.html +109 -0
- package/skills/talking-head-recut/references/styles/academic.html +172 -0
- package/skills/talking-head-recut/references/styles/audit.html +170 -0
- package/skills/talking-head-recut/references/styles/editorial.html +189 -0
- package/skills/talking-head-recut/references/styles/geom.html +181 -0
- package/skills/talking-head-recut/references/styles/minimal.html +130 -0
- package/skills/talking-head-recut/references/styles/spotlight.html +142 -0
- package/skills/talking-head-recut/references/styles/swiss.html +188 -0
- package/skills/talking-head-recut/references/styles/terminal.html +196 -0
- package/skills/talking-head-recut/references/styles/whiteboard.html +170 -0
- package/skills/talking-head-recut/references/styles/xhs.html +206 -0
- package/skills/gsap/SKILL.md +0 -213
- package/skills/gsap/references/effects.md +0 -297
- package/skills/hyperframes/patterns.md +0 -118
- package/skills/hyperframes/references/captions.md +0 -132
- package/skills/hyperframes/references/css-patterns.md +0 -373
- package/skills/hyperframes/references/motion-principles.md +0 -69
- package/skills/hyperframes/references/tts.md +0 -75
- package/skills/hyperframes/scripts/contrast-report.mjs +0 -335
- package/skills/hyperframes/visual-styles.md +0 -211
- package/skills/website-to-hyperframes/SKILL.md +0 -125
- package/skills/website-to-hyperframes/references/step-1-capture.md +0 -74
- package/skills/website-to-hyperframes/references/step-2-design.md +0 -178
- package/skills/website-to-hyperframes/references/step-4-storyboard.md +0 -246
- package/skills/website-to-hyperframes/references/step-5-vo.md +0 -42
- package/skills/website-to-hyperframes/references/step-6-build.md +0 -229
- package/skills/website-to-hyperframes/references/step-7-validate.md +0 -114
- /package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-3d.md +0 -0
- /package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-blur.md +0 -0
- /package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-cover.md +0 -0
- /package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-dissolve.md +0 -0
- /package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-distortion.md +0 -0
- /package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-grid.md +0 -0
- /package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-light.md +0 -0
- /package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-mechanical.md +0 -0
- /package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-other.md +0 -0
- /package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-push.md +0 -0
- /package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-radial.md +0 -0
- /package/skills/{hyperframes/references → hyperframes-animation}/transitions/css-scale.md +0 -0
- /package/skills/{hyperframes → hyperframes-creative}/palettes/bold-energetic.md +0 -0
- /package/skills/{hyperframes → hyperframes-creative}/palettes/clean-corporate.md +0 -0
- /package/skills/{hyperframes → hyperframes-creative}/palettes/dark-premium.md +0 -0
- /package/skills/{hyperframes → hyperframes-creative}/palettes/jewel-rich.md +0 -0
- /package/skills/{hyperframes → hyperframes-creative}/palettes/monochrome.md +0 -0
- /package/skills/{hyperframes → hyperframes-creative}/palettes/nature-earth.md +0 -0
- /package/skills/{hyperframes → hyperframes-creative}/palettes/neon-electric.md +0 -0
- /package/skills/{hyperframes → hyperframes-creative}/palettes/pastel-soft.md +0 -0
- /package/skills/{hyperframes → hyperframes-creative}/palettes/warm-editorial.md +0 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# news — category module (search-driven)
|
|
2
|
+
|
|
3
|
+
Search a real news article → animate it as an **article-highlight** — a faithful HF port of the centered-emphasis technique. Signature motion: the article text is laid out at a **readable size (NOT zoomed)**, slides + fades up, then the **keyword is highlighted in place** — a marker band grows left→right behind it. No blow-up zoom. ~5–7s.
|
|
4
|
+
|
|
5
|
+
Two layouts share that one highlight core — pick by aspect + whether there's a logo / person to feature:
|
|
6
|
+
|
|
7
|
+
| Layout | Aspect | Use when | Has |
|
|
8
|
+
| ------------------------- | ---------- | --------------------------------------------------------------- | -------------------------------------------------------------------------- |
|
|
9
|
+
| **A · centered-emphasis** | 9:16 / 1:1 | text-only, social vertical | kicker + one centered sentence + keyword highlight |
|
|
10
|
+
| **B · full article** | 16:9 | there's a real **outlet logo** and/or a **person** in the story | logo + date + multi-line headline highlight + dek + outlet + person cutout |
|
|
11
|
+
|
|
12
|
+
## Source (Step 2)
|
|
13
|
+
|
|
14
|
+
RWA / web search (or `hyperframes capture`) → a real article. The Director extracts the **keyword** (1–2 words / a number / a name — the hook) and, for Layout B, also a **brand logo**, a **date**, and a **person photo**. `asset_needs: { kind: news|web|image, query }` — request the logo (Wikimedia / simple-icons) and the person photo (Wikimedia) as separate asset queries. Run the person photo through `hyperframes remove-background <in> -o <out>.png` to get a transparent cutout.
|
|
15
|
+
|
|
16
|
+
## The highlight core (shared by both layouts) — the marker-band technique
|
|
17
|
+
|
|
18
|
+
The keyword highlight is a marker band grown L→R via `background-size` (NOT a `transform:scaleX` bar):
|
|
19
|
+
|
|
20
|
+
```css
|
|
21
|
+
.hl {
|
|
22
|
+
--hlw: 0%;
|
|
23
|
+
background-image: linear-gradient(var(--hl), var(--hl)); /* --hl: rgba(250,222,99,.6) */
|
|
24
|
+
background-repeat: no-repeat;
|
|
25
|
+
background-position: 0 72%;
|
|
26
|
+
background-size: var(--hlw) 64%;
|
|
27
|
+
box-decoration-break: clone;
|
|
28
|
+
-webkit-box-decoration-break: clone;
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`box-decoration-break:clone` makes the band **wrap across line breaks** seamlessly — a multi-word keyword spanning 2–3 lines still highlights continuously (the old `scaleX` bar could not). GSAP tweens the CSS var `--hlw` 0%→100%, **swept on AFTER the text settles — never pre-applied**. Optionally scale the duration with keyword length ~0.5–1.5s.
|
|
33
|
+
|
|
34
|
+
## Layout A — centered-emphasis (9:16, text-only) — Builder
|
|
35
|
+
|
|
36
|
+
1. **Lay out the key SENTENCE at a readable size — do NOT zoom.** Paper-light stage; an outlet `#kicker` (e.g. "BBC NEWS · TECHNOLOGY", brand accent) at top; the key sentence centered, serif, **~70–76px / 700 / line-height ~1.4**, `max-width ≈ 900`. The whole sentence stays legible; the keyword is emphasized _within_ it.
|
|
37
|
+
2. Wrap the keyword inline: `… raised <span class="hl" id="kw">$750M</span> at …`.
|
|
38
|
+
3. **Timeline** (seek-safe, paused): kicker fades+slides in → **sentence slides+fades up** (`set{autoAlpha:0,y:52}`→`to{autoAlpha:1,y:0,duration:0.8,ease:"power3.out"}`, no zoom) → **keyword highlight grows** (`--hlw 0→100%`, after the sentence settles) → gentle hold (`scale 1.012`).
|
|
39
|
+
|
|
40
|
+
**Reference:** `samples/news/_ref-centered-emphasis.html` (+ `news/v2-*`).
|
|
41
|
+
|
|
42
|
+
## Layout B — full article (16:9, logo + person) — Builder
|
|
43
|
+
|
|
44
|
+
The editorial article-card layout (logo top-left + date + big serif headline with a multi-line keyword highlight + dek + outlet bottom-left + a background-removed **person cutout** bottom-right). 1920×1080, paper-light gradient stage, Georgia serif.
|
|
45
|
+
|
|
46
|
+
1. **Logo** top-left (`#logo`, ~64px) — inline the outlet/brand SVG, `fill:currentColor`, set `color` to the mark's own hue (or near-black for a monochrome mark). **Date** below it (`#date`, ~30px, muted).
|
|
47
|
+
2. **Headline** (`#headline`, Georgia **96px / 700**, `width≈1080`, `line-height 1.16`) with the keyword wrapped in `<span class="hl" id="kw">` — the highlight band sweeps across **all wrapped lines** of the phrase.
|
|
48
|
+
3. **Dek** (`#dek`, Helvetica ~38px gray) under the headline; **outlet** (`#outlet`, Georgia bold ~50px) bottom-left.
|
|
49
|
+
4. **Person cutout** (`#subject`, the bg-removed PNG, `height≈860`, `right:40; bottom:0`, `drop-shadow`) — **slides up from bottom-right** as the hero beat.
|
|
50
|
+
5. **Timeline** (seek-safe, paused): logo `back.out` @0.15 → date @0.4 → **subject slides up** (`set{autoAlpha:0,x:90,y:60}`→`to{autoAlpha:1,x:0,y:0,duration:0.85,ease:"power3.out"}`) @0.45 → headline @0.7 → dek @1.5 → outlet @1.9 → **keyword highlight** (`--hlw 0→100%`, `duration:0.8`) @2.2. duration ~6.5s.
|
|
51
|
+
|
|
52
|
+
**Reference:** `samples/news/_ref-article-layout.html` (a real article rendered with a real outlet logo + a background-removed person + a real story).
|
|
53
|
+
|
|
54
|
+
## Critical
|
|
55
|
+
|
|
56
|
+
Highlight is **grown in place, swept on AFTER the text — never pre-applied**. The text **stays readable — do NOT zoom the keyword to fill the frame** (team feedback 2026-06-09: zoom loses context and reads wrong; the technique never zooms — it presents the text and highlights the word). For Layout B, the person MUST be a `remove-background` cutout (no rectangular photo box). Deterministic; honor `references/builder-contract.md`.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# stat — category module
|
|
2
|
+
|
|
3
|
+
A single **hero number** reveal. Asset-free (the "input" is the number). ~4–6s.
|
|
4
|
+
|
|
5
|
+
## Plan (Director)
|
|
6
|
+
|
|
7
|
+
`content`: `{ value, prefix ($), suffix (% / x / K-M-B), label, ring: bool }`. Envelope: bold display font, restrained palette + one accent.
|
|
8
|
+
|
|
9
|
+
## Vocabulary / leans on
|
|
10
|
+
|
|
11
|
+
- Block: **`apple-money-count`** (finance-flavoured: $ counter + green flash + money burst + SFX) when it fits; otherwise hand-author.
|
|
12
|
+
- Rules: `hyperframes-animation/rules/{counting-dynamic-scale, stat-bars-and-fills}`.
|
|
13
|
+
- Primitives: `count_up` (odometer) · `scale_pop` · `ring_fill` (arc) · `label_stagger` (after value) · `hold`.
|
|
14
|
+
|
|
15
|
+
## Build (reuse-first)
|
|
16
|
+
|
|
17
|
+
Reuse `apple-money-count` + set target / prefix / suffix / label / palette; **or** hand-author per the proven prototype `v0-stat-motion-demo`:
|
|
18
|
+
|
|
19
|
+
- **count-up is timeline-driven** — tween a proxy `{v:0}→target` with `onUpdate` writing the formatted number (seek-safe; never setInterval/wall-clock).
|
|
20
|
+
- `font-variant-numeric: tabular-nums`; decelerating ease; ~1.2–1.6s then **hold** the final value.
|
|
21
|
+
- ring/arc via `stroke-dashoffset`, finishing in sync with the count-up; label fades in **after** the number lands (value → meaning).
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# tweet — category module (search-driven)
|
|
2
|
+
|
|
3
|
+
**Search a tweet → animate the tweet card.** Grounded in a real post (RWA). ~4–8s.
|
|
4
|
+
|
|
5
|
+
## Source (Step 2)
|
|
6
|
+
|
|
7
|
+
RWA `search_tweets` (specific query, or a given tweet URL/id) → tweet: author, handle, avatar, text, timestamp, metrics (likes/reposts). `asset_needs`: `{ kind: tweet, query|source, treatment: none }`. Freeze the avatar + any embedded media.
|
|
8
|
+
|
|
9
|
+
## Vocabulary / leans on
|
|
10
|
+
|
|
11
|
+
- Block: registry **`x-post`** (animated X/Twitter post card overlay with engagement metrics) — reuse it directly.
|
|
12
|
+
- Primitives: card slide/scale-in · text type-on / line reveal · avatar pop · metrics **count-up** · optional emphasis on a keyword.
|
|
13
|
+
|
|
14
|
+
## Build (reuse-first)
|
|
15
|
+
|
|
16
|
+
`npx hyperframes add x-post` → fill author / handle / avatar / text / metrics from the resolved tweet; animate the card in, type-on the text (or line-by-line reveal), count-up the metrics. Frozen project-local avatar/media (never a remote URL). `export: alpha-overlay` if it's meant to sit over other footage.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# webpage — category module (search-driven)
|
|
2
|
+
|
|
3
|
+
**Animate a webpage / link** (the "website animation" use case). Search-driven: the user gives or names a URL → fetch/capture it → animate it (scroll-through, UI reveal, cursor demo, region callouts). Distinct from captioning an existing _video file_ (that's `/embedded-captions`) and from a narrated video _of_ a site (that's a `/product-launch-video` site-tour ask); here the source is a _web page_ and the output is a short, unnarrated highlight shot.
|
|
4
|
+
|
|
5
|
+
## Source (Step 2)
|
|
6
|
+
|
|
7
|
+
Fetch the page via `hyperframes capture --json` (DOM + screenshots) or a provided screenshot → frozen project-local image(s)/DOM. `asset_needs`: `{ kind: web, source: <url>, treatment: none }`.
|
|
8
|
+
|
|
9
|
+
Inspect the capture result before building. If `BLOCKED.md` exists, JSON reports `ok: false`, or the
|
|
10
|
+
command exits non-zero, stop the URL-capture path and report the reason. Continue with a provided
|
|
11
|
+
screenshot only when it was an explicit source from the user (or the user explicitly chooses it
|
|
12
|
+
after the failure). Do not animate a blocked partial capture, invent missing DOM, or eyeball element
|
|
13
|
+
coordinates from protection/challenge pages.
|
|
14
|
+
|
|
15
|
+
This web need cannot use the generic asset-free fallback: it requires a usable captured screenshot
|
|
16
|
+
or DOM, or a provided screenshot explicitly selected by the user. If none is available, stop.
|
|
17
|
+
|
|
18
|
+
## Vocabulary / leans on
|
|
19
|
+
|
|
20
|
+
- Rules: `hyperframes-animation/rules/{3d-page-scroll, demo-page-scroll-spotlight, cursor-click-ripple, coordinate-target-zoom, viewport-change}`.
|
|
21
|
+
- Primitives: scroll pan · spotlight/dim · cursor move + click-ripple · zoom-to-region · callout pin + label.
|
|
22
|
+
|
|
23
|
+
## Build (reuse-first)
|
|
24
|
+
|
|
25
|
+
Place the captured page as the base layer; animate a **scroll-through** (translateY over the page height), **spotlight** key regions (dim + highlight), a **cursor** that moves and clicks (ripple), **zoom** to a coordinate, and **callout** pins/labels anchored to page regions. Honor `builder-contract.md`.
|
|
26
|
+
|
|
27
|
+
**Two rules that match the news article-highlight (see `../news/module.md`):**
|
|
28
|
+
|
|
29
|
+
- **Highlights are swept/animated ON, never pre-applied** — a spotlight box wipes in (`scaleX 0→1`), a marker sweeps a region, a callout pops _after_ the zoom lands; the page never starts pre-annotated.
|
|
30
|
+
- **Anchor to REAL element positions** — `hyperframes capture` gives the page HTML/DOM, so measure the target element (`getBoundingClientRect` → stage-local) and zoom/highlight it exactly, step-by-step (the "highlight a real element" technique). Don't eyeball coords.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# locate — find "X" in an image (no detector API assumed)
|
|
2
|
+
|
|
3
|
+
The single contract every consumer (asset-fusion ring, webpage highlight, future
|
|
4
|
+
explainer/recut overlays) uses:
|
|
5
|
+
|
|
6
|
+
```
|
|
7
|
+
locate(image, target-description) → { box: [x0,y0,x1,y1], center: [cx,cy] } # normalized 0..1
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Why this exists
|
|
11
|
+
|
|
12
|
+
Author models are unreliable at **regressing pixel coordinates** on a cluttered
|
|
13
|
+
full image (measured: weak vision models ~16–24% center error → rings land off-target)
|
|
14
|
+
but reliable at **picking a numbered strip** (~3–4% with the loop below). So:
|
|
15
|
+
never eyeball coordinates; localize by discrete choice. (RSVP, ACL 2025.)
|
|
16
|
+
|
|
17
|
+
## Routing — pick the cheapest path that's actually available
|
|
18
|
+
|
|
19
|
+
1. **A strong detector is available** (e.g. `GEMINI_API_KEY` in env) →
|
|
20
|
+
`node grounding/locate.mjs auto <img> "<target>"` — one call, done.
|
|
21
|
+
**Never assume the key exists.** No key → path 2.
|
|
22
|
+
2. **No detector (the normal case)** → YOU are the localizer; run the grid loop.
|
|
23
|
+
|
|
24
|
+
## The grid loop (you read images between steps)
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
node grounding/locate.mjs overlay <img> --out /tmp/g
|
|
28
|
+
→ READ /tmp/g/gv.png (vertical strips 1-9) and gh.png (horizontal 1-9);
|
|
29
|
+
decide which strip numbers the target spans (list EVERY strip it touches).
|
|
30
|
+
node grounding/locate.mjs region <img> --vids 4,5 --hids 6,7 --out /tmp/g
|
|
31
|
+
→ READ /tmp/g/gc.png (the region cropped + upscaled, finer 6×6 grid);
|
|
32
|
+
pick the finer strips. (Pick strips again — do NOT switch to estimating
|
|
33
|
+
coordinates; discrete choice is the whole point, at BOTH stages.)
|
|
34
|
+
node grounding/locate.mjs final <img> --region <from step 2> --vids 3,4 --hids 3,4
|
|
35
|
+
→ the final {box, center}.
|
|
36
|
+
node grounding/locate.mjs mark <img> --box <final box> --out /tmp/g/check.png
|
|
37
|
+
→ VERIFY: READ check.png. Red box ON the target → done. Off → redo
|
|
38
|
+
region/final with corrected strips (you now know which direction). Never
|
|
39
|
+
skip this step; it converts silent misses into one cheap retry.
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Ambiguity — resolve BEFORE localizing
|
|
43
|
+
|
|
44
|
+
If the target description can match several instances ("a drum" when the scene
|
|
45
|
+
has five), no geometry will save you. First make the reference unique
|
|
46
|
+
("the right-most drum", "the drum on the front boat"), asking the user if
|
|
47
|
+
needed — then run the loop.
|
|
48
|
+
|
|
49
|
+
## Degradation path (if locate.mjs itself is unavailable)
|
|
50
|
+
|
|
51
|
+
The idea is 5 lines — reproduce it with any image tool:
|
|
52
|
+
draw a numbered 9×9 grid → pick the strips the target spans → crop that region
|
|
53
|
+
(+pad ~0.4 strip) and upscale → draw a finer 6×6 grid → pick again → map back
|
|
54
|
+
(`global = region_origin + local × region_size`) → draw the box and LOOK at it.
|
|
55
|
+
|
|
56
|
+
## Notes
|
|
57
|
+
|
|
58
|
+
- Geometry is frozen in `locate.mjs` (node + ffmpeg, zero npm deps — both
|
|
59
|
+
already required by hyperframes). Don't re-implement it ad hoc; the measured
|
|
60
|
+
accuracy holds for THIS implementation.
|
|
61
|
+
- Consumers: `samples/asset-fusion/_ref-circle-highlight.html` takes `CFG.box`
|
|
62
|
+
directly from `final`/`auto` output.
|
|
63
|
+
- Measured end-to-end (same agent, same template, only the localization step
|
|
64
|
+
differs): eyeballing 6.5% avg center error → this protocol 2.3%, no case worse.
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* locate.mjs — find "X" in an image WITHOUT any detector API or key.
|
|
3
|
+
*
|
|
4
|
+
* You (the author model) are weak at regressing pixel coordinates but strong at
|
|
5
|
+
* "which numbered strip is the target in?" — so localization = RSVP grid-index
|
|
6
|
+
* (ACL 2025 long.715): pick strips on a numbered grid, reconstruct the box
|
|
7
|
+
* geometrically. Zero npm deps — node + ffmpeg (both already required by
|
|
8
|
+
* hyperframes). Full protocol: grounding/PROTOCOL.md.
|
|
9
|
+
*
|
|
10
|
+
* THE LOOP (you read images between steps):
|
|
11
|
+
* 1) node locate.mjs overlay <img> --out DIR
|
|
12
|
+
* → DIR/gv.png (vertical strips 1..9) + DIR/gh.png (horizontal 1..9).
|
|
13
|
+
* READ both, pick the strip numbers the target spans.
|
|
14
|
+
* 2) node locate.mjs region <img> --vids 4,5 --hids 6,7 --out DIR
|
|
15
|
+
* → prints coarse region + writes DIR/gc.png (region cropped+upscaled,
|
|
16
|
+
* finer 6×6 grid). READ it, pick the finer strips.
|
|
17
|
+
* 3) node locate.mjs final <img> --region x0,y0,x1,y1 --vids 3,4 --hids 3,4
|
|
18
|
+
* → {box, center} normalized to the FULL image.
|
|
19
|
+
* 4) node locate.mjs mark <img> --box x0,y0,x1,y1 --out DIR/check.png
|
|
20
|
+
* → VERIFY: read check.png — is the red box on the target? If off,
|
|
21
|
+
* redo step 2/3 with corrected strips. Never skip this.
|
|
22
|
+
*/
|
|
23
|
+
import { execFileSync } from "node:child_process";
|
|
24
|
+
import { existsSync, mkdirSync, copyFileSync } from "node:fs";
|
|
25
|
+
|
|
26
|
+
const N1 = 9,
|
|
27
|
+
PAD1 = 0.4; // stage 1: strips per axis, padding in STRIP units
|
|
28
|
+
const N2 = 6,
|
|
29
|
+
PAD2 = 0.25; // stage 2 (crop)
|
|
30
|
+
const GREEN = "0x3CDC5A",
|
|
31
|
+
BLUE = "0x3C82FF",
|
|
32
|
+
RED = "0xFF3232";
|
|
33
|
+
|
|
34
|
+
const ff = (args) =>
|
|
35
|
+
execFileSync("ffmpeg", ["-v", "error", "-y", ...args], {
|
|
36
|
+
stdio: ["ignore", "ignore", "inherit"],
|
|
37
|
+
});
|
|
38
|
+
function probe(img) {
|
|
39
|
+
const out = execFileSync("ffprobe", [
|
|
40
|
+
"-v",
|
|
41
|
+
"error",
|
|
42
|
+
"-select_streams",
|
|
43
|
+
"v:0",
|
|
44
|
+
"-show_entries",
|
|
45
|
+
"stream=width,height",
|
|
46
|
+
"-of",
|
|
47
|
+
"csv=p=0",
|
|
48
|
+
"--",
|
|
49
|
+
img,
|
|
50
|
+
])
|
|
51
|
+
.toString()
|
|
52
|
+
.trim();
|
|
53
|
+
const [w, h] = out.split(",").map(Number);
|
|
54
|
+
return { w, h };
|
|
55
|
+
}
|
|
56
|
+
function font() {
|
|
57
|
+
const dst = "/tmp/locate-font.ttf";
|
|
58
|
+
if (!existsSync(dst)) {
|
|
59
|
+
for (const c of [
|
|
60
|
+
"/System/Library/Fonts/Supplemental/Arial Bold.ttf",
|
|
61
|
+
"/System/Library/Fonts/Supplemental/Arial.ttf",
|
|
62
|
+
"/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf",
|
|
63
|
+
]) {
|
|
64
|
+
if (existsSync(c)) {
|
|
65
|
+
copyFileSync(c, dst);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return dst;
|
|
71
|
+
}
|
|
72
|
+
function gridFilters(w, h, n, axis, fz) {
|
|
73
|
+
const F = font(),
|
|
74
|
+
fs = [];
|
|
75
|
+
if (axis === "v" || axis === "both") {
|
|
76
|
+
for (let i = 1; i < n; i++)
|
|
77
|
+
fs.push(`drawbox=x=${Math.round((i * w) / n)}:y=0:w=2:h=${h}:color=${GREEN}@0.8:t=fill`);
|
|
78
|
+
for (let i = 0; i < n; i++)
|
|
79
|
+
fs.push(
|
|
80
|
+
`drawtext=fontfile=${F}:text='${i + 1}':x=${Math.round(((i + 0.5) * w) / n - fz * 0.3)}:y=6:fontsize=${fz}:fontcolor=black:box=1:boxcolor=white@0.95:boxborderw=5`,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
if (axis === "h" || axis === "both") {
|
|
84
|
+
for (let j = 1; j < n; j++)
|
|
85
|
+
fs.push(`drawbox=x=0:y=${Math.round((j * h) / n)}:w=${w}:h=2:color=${BLUE}@0.8:t=fill`);
|
|
86
|
+
for (let j = 0; j < n; j++)
|
|
87
|
+
fs.push(
|
|
88
|
+
`drawtext=fontfile=${F}:text='${j + 1}':x=6:y=${Math.round(((j + 0.5) * h) / n - fz * 0.5)}:fontsize=${fz}:fontcolor=black:box=1:boxcolor=white@0.95:boxborderw=5`,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
return fs;
|
|
92
|
+
}
|
|
93
|
+
const ids = (s) => String(s).split(",").filter(Boolean).map(Number);
|
|
94
|
+
const regionOf = (v, h, n, pad) => [
|
|
95
|
+
Math.max(Math.min(...v) - 1 - pad, 0) / n,
|
|
96
|
+
Math.max(Math.min(...h) - 1 - pad, 0) / n,
|
|
97
|
+
Math.min(Math.max(...v) + pad, n) / n,
|
|
98
|
+
Math.min(Math.max(...h) + pad, n) / n,
|
|
99
|
+
];
|
|
100
|
+
const r4 = (x) => Math.round(x * 1e4) / 1e4;
|
|
101
|
+
const out = (o) => console.log(JSON.stringify(o));
|
|
102
|
+
|
|
103
|
+
// --- tiny arg parsing: locate.mjs <cmd> <img?> --k v ---
|
|
104
|
+
const [cmd, ...rest] = process.argv.slice(2);
|
|
105
|
+
const pos = rest.filter((a) => !a.startsWith("--"));
|
|
106
|
+
const opt = {};
|
|
107
|
+
for (let i = 0; i < rest.length; i++)
|
|
108
|
+
if (rest[i].startsWith("--")) opt[rest[i].slice(2)] = rest[i + 1];
|
|
109
|
+
const img = pos[0];
|
|
110
|
+
|
|
111
|
+
if (cmd === "overlay") {
|
|
112
|
+
const dir = opt.out || ".";
|
|
113
|
+
mkdirSync(dir, { recursive: true });
|
|
114
|
+
const n = Number(opt.n || N1);
|
|
115
|
+
const { w, h } = probe(img);
|
|
116
|
+
const fz = Math.max(16, Math.round(Math.min(w, h) / 22));
|
|
117
|
+
ff(["-i", img, "-vf", gridFilters(w, h, n, "v", fz).join(","), `${dir}/gv.png`]);
|
|
118
|
+
ff(["-i", img, "-vf", gridFilters(w, h, n, "h", fz).join(","), `${dir}/gh.png`]);
|
|
119
|
+
out({
|
|
120
|
+
w,
|
|
121
|
+
h,
|
|
122
|
+
n,
|
|
123
|
+
vertical: `${dir}/gv.png`,
|
|
124
|
+
horizontal: `${dir}/gh.png`,
|
|
125
|
+
next: "READ gv.png + gh.png, then: locate.mjs region <img> --vids .. --hids .. --out " + dir,
|
|
126
|
+
});
|
|
127
|
+
} else if (cmd === "region") {
|
|
128
|
+
const dir = opt.out || ".";
|
|
129
|
+
mkdirSync(dir, { recursive: true });
|
|
130
|
+
const n = Number(opt.n || N1),
|
|
131
|
+
nf = Number(opt.nf || N2);
|
|
132
|
+
const reg = regionOf(ids(opt.vids), ids(opt.hids), n, PAD1);
|
|
133
|
+
const { w, h } = probe(img);
|
|
134
|
+
const cx = Math.floor(reg[0] * w),
|
|
135
|
+
cy = Math.floor(reg[1] * h);
|
|
136
|
+
const cw = Math.max(2, Math.floor((reg[2] - reg[0]) * w)),
|
|
137
|
+
ch = Math.max(2, Math.floor((reg[3] - reg[1]) * h));
|
|
138
|
+
const uw = Math.max(cw, 640),
|
|
139
|
+
uh = Math.round((ch * uw) / cw);
|
|
140
|
+
const fz = Math.max(15, Math.round(Math.min(uw, uh) / 16));
|
|
141
|
+
ff([
|
|
142
|
+
"-i",
|
|
143
|
+
img,
|
|
144
|
+
"-vf",
|
|
145
|
+
[
|
|
146
|
+
`crop=${cw}:${ch}:${cx}:${cy}`,
|
|
147
|
+
`scale=${uw}:${uh}`,
|
|
148
|
+
...gridFilters(uw, uh, nf, "both", fz),
|
|
149
|
+
].join(","),
|
|
150
|
+
`${dir}/gc.png`,
|
|
151
|
+
]);
|
|
152
|
+
out({
|
|
153
|
+
region: reg.map(r4),
|
|
154
|
+
crop_grid: `${dir}/gc.png`,
|
|
155
|
+
nf,
|
|
156
|
+
next: `READ gc.png, then: locate.mjs final <img> --region ${reg.map(r4).join(",")} --vids .. --hids ..`,
|
|
157
|
+
});
|
|
158
|
+
} else if (cmd === "final") {
|
|
159
|
+
const nf = Number(opt.nf || N2);
|
|
160
|
+
const reg = opt.region.split(",").map(Number);
|
|
161
|
+
const rl = regionOf(ids(opt.vids), ids(opt.hids), nf, PAD2);
|
|
162
|
+
const [x0, y0, x1, y1] = reg;
|
|
163
|
+
const box = [
|
|
164
|
+
x0 + rl[0] * (x1 - x0),
|
|
165
|
+
y0 + rl[1] * (y1 - y0),
|
|
166
|
+
x0 + rl[2] * (x1 - x0),
|
|
167
|
+
y0 + rl[3] * (y1 - y0),
|
|
168
|
+
].map(r4);
|
|
169
|
+
out({
|
|
170
|
+
box,
|
|
171
|
+
center: [r4((box[0] + box[2]) / 2), r4((box[1] + box[3]) / 2)],
|
|
172
|
+
next:
|
|
173
|
+
"VERIFY: locate.mjs mark <img> --box " +
|
|
174
|
+
box.join(",") +
|
|
175
|
+
" --out <dir>/check.png — then READ it",
|
|
176
|
+
});
|
|
177
|
+
} else if (cmd === "mark") {
|
|
178
|
+
const box = opt.box.split(",").map(Number);
|
|
179
|
+
const { w, h } = probe(img);
|
|
180
|
+
const bx = Math.round(box[0] * w),
|
|
181
|
+
by = Math.round(box[1] * h);
|
|
182
|
+
const bw = Math.max(2, Math.round((box[2] - box[0]) * w)),
|
|
183
|
+
bh = Math.max(2, Math.round((box[3] - box[1]) * h));
|
|
184
|
+
const dst = opt.out || "./check.png";
|
|
185
|
+
ff(["-i", img, "-vf", `drawbox=x=${bx}:y=${by}:w=${bw}:h=${bh}:color=${RED}@1:t=6`, dst]);
|
|
186
|
+
out({
|
|
187
|
+
marked: dst,
|
|
188
|
+
next: "READ it — red box on the target? If off, redo region/final with corrected strips.",
|
|
189
|
+
});
|
|
190
|
+
} else if (cmd === "auto") {
|
|
191
|
+
// OPTIONAL fast path — only if a strong detector key happens to exist. Never assume it.
|
|
192
|
+
const key = process.env.GEMINI_API_KEY;
|
|
193
|
+
if (!key) {
|
|
194
|
+
console.error(
|
|
195
|
+
"auto needs GEMINI_API_KEY; use the grid loop instead (overlay→region→final→mark)",
|
|
196
|
+
);
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
const target = pos[1];
|
|
200
|
+
const b64 = execFileSync("base64", ["-i", img]).toString().replace(/\n/g, "");
|
|
201
|
+
const mime = img.match(/\.png$/i) ? "image/png" : "image/jpeg";
|
|
202
|
+
const body = {
|
|
203
|
+
contents: [
|
|
204
|
+
{
|
|
205
|
+
parts: [
|
|
206
|
+
{ inline_data: { mime_type: mime, data: b64 } },
|
|
207
|
+
{
|
|
208
|
+
text: `Detect "${target}". Return ONLY {"box_2d":[ymin,xmin,ymax,xmax]} integers 0-1000.`,
|
|
209
|
+
},
|
|
210
|
+
],
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
generationConfig: { temperature: 0, response_mime_type: "application/json" },
|
|
214
|
+
};
|
|
215
|
+
const res = await fetch(
|
|
216
|
+
`https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:generateContent?key=${key}`,
|
|
217
|
+
{ method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) },
|
|
218
|
+
);
|
|
219
|
+
const t = (await res.json()).candidates[0].content.parts[0].text;
|
|
220
|
+
let bb = JSON.parse(t.match(/\{[\s\S]*\}/)[0]).box_2d;
|
|
221
|
+
if (Array.isArray(bb[0])) bb = bb[0];
|
|
222
|
+
const s = Math.max(...bb) > 1.5 ? 1000 : 1;
|
|
223
|
+
const box = [bb[1] / s, bb[0] / s, bb[3] / s, bb[2] / s].map(r4);
|
|
224
|
+
out({ box, center: [r4((box[0] + box[2]) / 2), r4((box[1] + box[3]) / 2)] });
|
|
225
|
+
} else {
|
|
226
|
+
console.error("usage: locate.mjs overlay|region|final|mark|auto … (see header comment)");
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# source phase — asset sourcing (asset-first)
|
|
2
|
+
|
|
3
|
+
Runs **only when `shot-plan.json.asset_needs` is non-empty** (the form categories never reach here). Sources each needed asset → a **frozen project-local path** + a ledger (`assets/index.md`). Uses `/media-use` (capture / asset prep) plus, **when an external asset-search skill such as media-use is installed**, its `resolve` step. If no such search capability is available, it **degrades to asset-free** (see below).
|
|
4
|
+
|
|
5
|
+
## Per asset_need
|
|
6
|
+
|
|
7
|
+
- `image / icon / logo / svg` → media-use `resolve`: **search** (asset_scout: Google Images / SerpAPI + Noun Project), **generate** (image model), or **user-supplied** (logo). Optional `treatment`: cutout (remove-bg) / recolor / vectorize.
|
|
8
|
+
- `news / web / tweet` → **RWA-style search** (media-use's documented lineage — `media-use/references/search-strategy.md` traces `resolve` to the RWA subagent). Two-pole queries: **atomic** (1–3 words, composable) or **specific** (5–15 words: a news event / tweet); never the middle. A failed specific query is dropped, not broadened.
|
|
9
|
+
|
|
10
|
+
## Steps
|
|
11
|
+
|
|
12
|
+
1. Read `asset_needs` from `shot-plan.json`.
|
|
13
|
+
2. For each: **analyze → search → review (use/maybe/reject — selection is the hard part; do NOT take the first/generated result) → freeze** the kept asset into `assets/` (rehost remote URLs).
|
|
14
|
+
3. Write `assets/index.md` — agent-readable ledger: `role → frozen path + provenance`.
|
|
15
|
+
4. For `asset-fusion`: also capture the asset's measurable geometry (so Director Part 2 can set `element_positions`) + an eyedropper palette.
|
|
16
|
+
|
|
17
|
+
## Degrade gracefully
|
|
18
|
+
|
|
19
|
+
If a provider / search is unavailable, mark the need unmet in `context.log`; the category falls back to asset-free where possible (e.g. `news` → typographic headline without the sourced image).
|
|
20
|
+
|
|
21
|
+
> Illustrative: `(cd "$PROJECT_DIR" && node <SKILL_DIR>/phases/source/resolve.mjs --plan ./shot-plan.json --out ./assets)` — or drive media-use's `resolve` procedure directly.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Builder contract — composition rules (detail behind agents/builder.md)
|
|
2
|
+
|
|
3
|
+
## Root must be sized
|
|
4
|
+
|
|
5
|
+
Root `#stage` (`data-composition-id`) needs `position: relative; width: <W>px; height: <H>px`. Without a resolved height, flex children collapse to ~0 and content piles into the top-left. Automated gates may miss it, so inspect proof snapshots.
|
|
6
|
+
|
|
7
|
+
## Layout before animation
|
|
8
|
+
|
|
9
|
+
1. Identify the **hero frame** (the moment most elements are visible) → build THAT in static CSS first, no GSAP.
|
|
10
|
+
2. `.scene-content` fills the scene with padding, not offsets:
|
|
11
|
+
```css
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-direction: column;
|
|
14
|
+
justify-content: center;
|
|
15
|
+
width: 100%;
|
|
16
|
+
height: 100%;
|
|
17
|
+
padding: 120px 160px;
|
|
18
|
+
gap: 24px;
|
|
19
|
+
box-sizing: border-box;
|
|
20
|
+
```
|
|
21
|
+
Never `position:absolute; top:Npx` on a content container (it overflows). Reserve absolute for decoratives. Keep ≥80px padding (title-safe margin).
|
|
22
|
+
3. **Entrances**: use `gsap.from()` only for a non-clip element active from `t=0`. Inside `.clip`, in sub-compositions, and for later entrances, use explicit `fromTo()`. The CSS position is ground truth; the tween is the journey to it.
|
|
23
|
+
4. **Exits**: only the final scene animates elements out; between scenes the transition IS the exit.
|
|
24
|
+
|
|
25
|
+
## Timeline / clip contract
|
|
26
|
+
|
|
27
|
+
- ONE `gsap.timeline({paused:true})` on `window.__timelines["<id>"]`; `tl.seek(0)`; never `tl.play()`.
|
|
28
|
+
- Timed elements: `class="clip"` + `data-start`/`data-duration`/`data-track-index` + a stable `id`. Timeline-driven groups inside one full-duration clip don't each need timing attrs.
|
|
29
|
+
- Deterministic only — no `Date.now()` / `Math.random()` / network. Count-ups tween a proxy object via `onUpdate` (seek-safe), never a wall-clock counter.
|
|
30
|
+
|
|
31
|
+
## Correctness
|
|
32
|
+
|
|
33
|
+
- **Seek-safe reveal of delayed elements**: on a non-clip element or wrapper inside a clip, use one registered timeline `fromTo()` with an explicit `{ autoAlpha: 0 }` start and `{ autoAlpha: 1, ... }` end. Do not page-load `gsap.set()` a later `.clip`, and never target `.clip` visibility; the framework owns its lifecycle. _(Eval finding.)_
|
|
34
|
+
- **Count-ups** tween a proxy via `onUpdate`; they only render when the host advances the timeline **with events enabled** (`tl.time()` / non-suppressed seek). A bare `seek(t, true)` freezes them at 0 — the HF render host must seek with events on. _(Eval finding.)_
|
|
35
|
+
- Clamp at tween bounds; don't let a spring overshoot past a held value.
|
|
36
|
+
- Allowed eases: `power1–4`, `back`, `bounce`, `circ`, `elastic`, `expo`, `sine` (`.in/.out/.inOut`).
|
|
37
|
+
- One motif per scene. Run `hyperframes check`; mark intentional overflow `data-layout-allow-overflow="true"`.
|
|
38
|
+
- **Palette discipline**: define all colors in one `palette` object / CSS custom properties — no inline hex scattered through the markup (for `asset-fusion`, eyedropper the palette from the asset).
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# text module · motion vocabulary (primitive → GSAP)
|
|
2
|
+
|
|
3
|
+
Named primitives the Director references in `motion` strings and the Builder implements. `code_hint`s are framework-neutral physics; the GSAP recipe is the HF implementation. Prefer an HF **registry component** (bottom) when one fits — don't reinvent.
|
|
4
|
+
|
|
5
|
+
## Entry
|
|
6
|
+
|
|
7
|
+
| primitive | GSAP recipe (into CSS end-state) | suits |
|
|
8
|
+
| ----------------------------- | -------------------------------------------------------------- | ------------------------- |
|
|
9
|
+
| `slide_bottom/top/left/right` | `from({ y:±150 / x:±200, opacity:0, ease:"power4.out" })` | calm, build, professional |
|
|
10
|
+
| `scale_grow` | `from({ scale:0, opacity:0, duration:.6, ease:"power2.out" })` | calm, gentle |
|
|
11
|
+
| `scale_punch` | `from({ scale:.6, opacity:0, ease:"back.out(2.2)" })` | impact, energetic |
|
|
12
|
+
| `fade_in` | `from({ opacity:0, duration:.4 })` | subtle |
|
|
13
|
+
| `fade_blur` | `from({ opacity:0, filter:"blur(14px)" })` | cinematic, dreamy |
|
|
14
|
+
| `typewriter` | reveal via clip/`SplitText` width step | technical, narrative |
|
|
15
|
+
| `word_reveal` | per-word `from({opacity:0,y:..}, stagger:.1)` | storytelling |
|
|
16
|
+
| `wave` | per-letter `from({y:..}, stagger:{each:.04})` | flowing, musical |
|
|
17
|
+
| `bounce_in` | `from({y:-120}, ease:"bounce.out")` | playful |
|
|
18
|
+
| `slam` | `from({ y:-300, ease:"power4.out" })` + shake on land | impact, heavy |
|
|
19
|
+
|
|
20
|
+
## Emphasis (in place, often on a beat)
|
|
21
|
+
|
|
22
|
+
| primitive | GSAP recipe | suits |
|
|
23
|
+
| ------------- | -------------------------------------------------------------------- | ------------------ |
|
|
24
|
+
| `scale_pulse` | `to({ scale:1.12, yoyo:true, repeat:1, ease:"sine.inOut" })` at beat | rhythmic, peak |
|
|
25
|
+
| `shake` | `to({ keyframes:[{x:-9},{x:9},{x:0}], ease:"none" })` | urgent, intense |
|
|
26
|
+
| `glow` | `to({ textShadow:"0 0 46px <ink/accent>", yoyo:true, repeat:1 })` | important, magical |
|
|
27
|
+
| `color_shift` | `to({ color:"<accent>" })` (or accent on the word in CSS) | dynamic |
|
|
28
|
+
|
|
29
|
+
## Exit
|
|
30
|
+
|
|
31
|
+
| primitive | GSAP recipe | suits |
|
|
32
|
+
| ----------- | -------------------------------------------------- | ---------- |
|
|
33
|
+
| `fade_out` | `to({ opacity:0, duration:.4, ease:"power2.in" })` | ending |
|
|
34
|
+
| `slide_out` | `to({ y/x: off, opacity:0, ease:"power2.in" })` | transition |
|
|
35
|
+
| `scale_out` | `to({ scale:1.06, opacity:0, ease:"power2.in" })` | transition |
|
|
36
|
+
|
|
37
|
+
## Accent graphics (not text)
|
|
38
|
+
|
|
39
|
+
`underline_sweep` `fromTo({scaleX:0},{scaleX:1}, transformOrigin:"left center")` · `bar_wipe` · `hold_breath` `to({scale:1.015, ease:"sine.inOut"})`.
|
|
40
|
+
|
|
41
|
+
## Prefer HF registry components when they fit
|
|
42
|
+
|
|
43
|
+
`caption-kinetic-slam` · `caption-editorial-emphasis` · `caption-neon-glow` · `caption-glitch-rgb` · `caption-particle-burst` · `caption-weight-shift` · `caption-matrix-decode` · `caption-pill-karaoke` · `shimmer-sweep`. These are pre-built, in-ecosystem, and already render-tested — the Builder should reach for them before hand-rolling an equivalent.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# shot-plan IR
|
|
2
|
+
|
|
3
|
+
The single contract between Director and Builder. One file: `PROJECT_DIR/shot-plan.json`.
|
|
4
|
+
|
|
5
|
+
```jsonc
|
|
6
|
+
{
|
|
7
|
+
// ── envelope (every category) ──
|
|
8
|
+
"category": "kinetic-type | stat | charts | logo-reveal | lower-thirds | webpage | news | tweet | asset-fusion",
|
|
9
|
+
"duration_s": 6,
|
|
10
|
+
"fps": 30,
|
|
11
|
+
"canvas": { "w": 1080, "h": 1920, "aspect": "9:16" },
|
|
12
|
+
"style": "free-form visual direction (mood / energy / reference)",
|
|
13
|
+
"palette": ["#…"], // or "derive-from-asset"
|
|
14
|
+
"font": "<HF embed-list font>",
|
|
15
|
+
"beats": [12, 37], // optional accent frames/seconds
|
|
16
|
+
"export": "mp4", // or "alpha-overlay" (transparent webm/mov)
|
|
17
|
+
|
|
18
|
+
// ── sourcing seam (Director Part 1) — [] means skip the source phase ──
|
|
19
|
+
"asset_needs": [
|
|
20
|
+
{
|
|
21
|
+
"role": "hero",
|
|
22
|
+
"kind": "image|icon|logo|svg|news|web|tweet",
|
|
23
|
+
"query": "…",
|
|
24
|
+
"source": "…",
|
|
25
|
+
"treatment": "cutout|recolor|vectorize|none",
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
|
|
29
|
+
// ── build directive (Director Part 2, reuse-first) ──
|
|
30
|
+
"block": "<catalog block id, e.g. data-chart | caption-kinetic-slam>", // optional
|
|
31
|
+
"customize": {
|
|
32
|
+
/* what to change on the block: data, text, palette, positions */
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
// ── category-specific content ──
|
|
36
|
+
"content": {
|
|
37
|
+
/* shape varies by category, below */
|
|
38
|
+
},
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Per-category `content` shapes:**
|
|
43
|
+
|
|
44
|
+
- `kinetic-type` → `scenes[]` `{ id, start, end, text, emphasis_words[], emotion, motion, beats[] }`
|
|
45
|
+
- `stat` → `{ value, prefix, suffix, label, ring: bool }`
|
|
46
|
+
- `charts` → `{ type: bar|line|pie|race|pct, data[], labels[], headline, axes: bool }`
|
|
47
|
+
- `logo-reveal` → `{ logo: <asset path>, tagline, url }`
|
|
48
|
+
- `lower-thirds` → `{ name, role, position, brand_colors[] }`
|
|
49
|
+
- `webpage` → `{ url, capture, highlights: [ { selector|region, label } ] }` (step-highlight a real captured page)
|
|
50
|
+
- `news` → `{ outlet, headline, body, keyword, layout: A|B, logo?, date?, subject? }` (article-highlight: lay text out readable — **no zoom** — then sweep a marker band over the keyword in place. Layout **A** = centered-emphasis 9:16 text-only; **B** = full article 16:9 with `logo` + `date` + `subject` (a person photo → `remove-background` cutout))
|
|
51
|
+
- `tweet` → `{ author, handle, avatar, text, metrics }`
|
|
52
|
+
- `asset-fusion` → `{ data_type, asset: <path>, affordance, element_positions: {center, extent, safe[], avoid[]}, derived_palette[], connectors[] }`
|
|
53
|
+
|
|
54
|
+
**Invariants:** `scenes` (if present) partition `[0, duration_s]` with no gaps/overlaps · empty `asset_needs` ⇒ Step 2 (source) is skipped · a named `block` ⇒ the Builder reuses + customizes it rather than hand-authoring.
|