dsh-hyperframes 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +23 -6
- package/README.md +22 -7
- package/lib/index.d.ts +1 -1
- package/lib/index.js +22 -1
- 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,53 @@
|
|
|
1
|
+
# Motion-Graphics Director
|
|
2
|
+
|
|
3
|
+
Turn a request into a `shot-plan.json` for a short (~3–30s) **design-led motion graphic**. You run in **two parts** around the asset-sourcing step: **Part 1 (plan)** before sourcing, **Part 2 (design)** after. You do NOT write composition code — that's the Builder. Schema: `references/shot-plan-ir.md`.
|
|
4
|
+
|
|
5
|
+
## Part 1 — Plan (before sourcing)
|
|
6
|
+
|
|
7
|
+
Emit a DRAFT `shot-plan.json`.
|
|
8
|
+
|
|
9
|
+
0. **Decide first: does this need a search?** No → a **form category** (user supplies content). Yes → emit a search plan; the specific **search-driven category** (`webpage` / `news` / `tweet` / `asset-fusion`) is confirmed by what the search returns (Step 2 → finalized in Part 2).
|
|
10
|
+
|
|
11
|
+
1. **Classify** — form categories by intent below; search-driven categories are picked post-search:
|
|
12
|
+
|
|
13
|
+
| Category | Pick when… |
|
|
14
|
+
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
15
|
+
| `kinetic-type` | a punchy line / quote / title; text is the hero |
|
|
16
|
+
| `stat` | a single hero number / count-up |
|
|
17
|
+
| `charts` | bar / line / pie / race / % from data |
|
|
18
|
+
| `logo-reveal` | a logo sting / brand lockup (user supplies the logo) |
|
|
19
|
+
| `lower-thirds` | name/title bars, callouts, social overlays |
|
|
20
|
+
| `maps` | a geographic shot — highlight regions, connect places, zoom to a location. Sub-fork: **vector** (D3, stylized) vs **basemap** (baked MapLibre — real satellite/dark/zoom-to-place) |
|
|
21
|
+
| `webpage` | highlight / animate a real captured web page or UI _(search-driven)_ |
|
|
22
|
+
| `news` | a news article → article-highlight: blur → zoom into keyword _(search-driven)_ |
|
|
23
|
+
| `tweet` | a tweet → animated card _(search-driven)_ |
|
|
24
|
+
| `asset-fusion` | a real photo/asset's geometry _becomes_ the chart _(search-driven)_ |
|
|
25
|
+
|
|
26
|
+
If genuinely ambiguous between two, ask exactly one question. Then load `categories/<id>/module.md` for that category's specifics.
|
|
27
|
+
|
|
28
|
+
2. **Asset strategy → `asset_needs[]`.** Each item: `{ role, kind: image|icon|logo|svg|news|web|tweet, query|source, treatment }`.
|
|
29
|
+
- asset-free (`kinetic-type`, most `stat`/`charts`) → `asset_needs: []`.
|
|
30
|
+
- `maps` → **vector** lane: `asset_needs: []` (D3/TopoJSON, runs live in HF). **basemap** lane (satellite/dark/zoom-to-place): `asset_needs: [{ type: "map-bake", … }]` (baked in Source — see `categories/maps/module.md`).
|
|
31
|
+
- `webpage` / `news` / `tweet` → search the real source (page / article / tweet) + a supporting image. **Two-pole queries only**: atomic (1–3 words, composable: portraits, logos, objects) OR specific (5–15 words: a news event, a tweet). Never the middle. A failed specific query is dropped, not broadened.
|
|
32
|
+
- `asset-fusion` → search or generate one hero asset.
|
|
33
|
+
- `logo-reveal` → user-supplied logo (`source`).
|
|
34
|
+
|
|
35
|
+
3. **Envelope**: `duration_s` (3–30), `fps` (30), `canvas` (default 1080×1920; 16:9 / 1:1 per platform), `style`, `palette` (hex list, or `"derive-from-asset"`), `font` (from the HF embed list), `beats`, `export` (`mp4` | `alpha-overlay`).
|
|
36
|
+
|
|
37
|
+
4. **Shot brief**: one paragraph — what the viewer experiences + the single dominant motion idea.
|
|
38
|
+
|
|
39
|
+
## Part 2 — Design (after sourcing)
|
|
40
|
+
|
|
41
|
+
Given the draft + resolved `assets/index.md` (if Step 2 ran) + `catalog-map.md`, design the shot **around the assets**:
|
|
42
|
+
|
|
43
|
+
- Pick the **catalog block(s)** + the `hyperframes-animation` rules / blueprints (catalog-aware — see `catalog-map.md`).
|
|
44
|
+
- Layout (hero-frame), motion (per `references/motion-vocabulary.md`), beats, pacing, exits.
|
|
45
|
+
- `asset-fusion`: read the asset's **geometric affordance** → `element_positions` (center / extent / safe-zones / avoid-zones) + **eyedropper palette** from the asset.
|
|
46
|
+
- Finalize `shot-plan.json`: `content.block` + `content.customize` + the per-category `content`.
|
|
47
|
+
|
|
48
|
+
## Heuristics (design-led short motion)
|
|
49
|
+
|
|
50
|
+
- **Motion IS the message**; no narration arc. Hook lands fast (~first 0.5s). **One dominant motif.** Pattern-interrupt if the piece runs >~2.5s (change exactly one thing). Effect intensity matches the energy. Legibility: a key element stays readable ≥~0.3s. Beats may be anticipated ~0.1s for perceived sync.
|
|
51
|
+
- **Reuse-first**: name a catalog block; ask for hand-authored motion only for gaps + the `asset-fusion` affordance.
|
|
52
|
+
|
|
53
|
+
Then hand `shot-plan.json` to the Builder.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Finalize / repair subagent
|
|
2
|
+
|
|
3
|
+
Perform snapshot QA and one in-place repair pass. Dispatch only when Step 5 `lint`, `check`, or snapshot review reports a defect. The orchestrator owns final approval and render; this agent never renders.
|
|
4
|
+
|
|
5
|
+
## Dispatch context
|
|
6
|
+
|
|
7
|
+
`SKILL_DIR` / `PROJECT_DIR` / proof snapshot times / `lint` and `check` output tails, when present.
|
|
8
|
+
|
|
9
|
+
## Flow
|
|
10
|
+
|
|
11
|
+
1. **Snapshots** — run `npx hyperframes snapshot --at <proof-times>` and inspect overflow, off-canvas content, text collisions, empty frames, wrong content, and unreadable motion.
|
|
12
|
+
2. **One in-place repair pass** — edit `compositions/index.html` for the visible issues. Never change a fixed `data-duration`; timing is set upstream.
|
|
13
|
+
3. **Recheck** — rerun `npx hyperframes lint`, `npx hyperframes check`, and the affected snapshots. Return the result to the orchestrator without rendering.
|
|
14
|
+
|
|
15
|
+
## STOP / escalate
|
|
16
|
+
|
|
17
|
+
Only when the shot is **fundamentally wrong** (whole content off, needs recomposition) — return to Step 3/4 (re-design + re-build), don't force it with edits. Small fixes never escalate.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Director → catalog block map (reuse-first)
|
|
2
|
+
|
|
3
|
+
The Builder's **default is to compose existing HF catalog blocks, not hand-author.** `npx hyperframes add <block>` drops a block's source into `compositions/`; the Builder then **customizes in place** — most blocks bake their content/data into their own script (only a few expose CSS-var `params`), so reuse = **add + edit**, not pure variable injection. Hand-author only (a) gaps no block covers and (b) the asset-fusion affordance binding.
|
|
4
|
+
|
|
5
|
+
After classifying intent → category, the **Director names the block(s) + what to customize** in the shot-plan IR:
|
|
6
|
+
|
|
7
|
+
```jsonc
|
|
8
|
+
"content": { "block": "data-chart", "customize": { "data": [...], "headline": "…", "palette": ["…"] } }
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Category → block(s)
|
|
12
|
+
|
|
13
|
+
| Category | Borrow from catalog | Customize | Gaps → hand-author |
|
|
14
|
+
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------- |
|
|
15
|
+
| **kinetic-typo** | one of **18 `caption-*`** (kinetic-slam, editorial-emphasis, clip-wipe, gradient-fill, neon-glow, glitch-rgb, matrix-decode, particle-burst, weight-shift, pill-karaoke, highlight, blend-difference…) | words; `emphasis_words` → `word--emphasis`; palette; font; timing | a motif none of the 18 cover |
|
|
16
|
+
| **charts** | `data-chart` (bar+line, staggered, value labels) | edit the data array + headline/subtitle; `--bg`/`--text` | pie/donut, bar-chart-race, ring/% |
|
|
17
|
+
| **stat** | `apple-money-count` (finance: $ counter + burst + SFX) **or** our generic `stat-motion` (any %/number + ring) | target, prefix/suffix, label, palette | — |
|
|
18
|
+
| maps/geo | **vector lane**: `us-map` (+bubble/hex/flow), `world-map`, `spain-map` + **hand-author** `geo-highlight`/`geo-flow`/`flag-borders`/`pin-rollout` (NOT in registry — build per `categories/maps/module.md`). **basemap lane** (real satellite/dark / zoom-to-place): bake via `categories/maps/bake-basemap.mjs` → `<video>` + geo-aligned SVG overlay (border draw-on + colour-block fills) | regions/data, palette, callouts/connectors, basemap style | (basemap lane now covers real imagery + zoom-to-address — was the gap) |
|
|
19
|
+
| diagram | `flowchart` (SVG connectors + nodes) | nodes, edges, labels | — |
|
|
20
|
+
| **code / code-reveal** | one of the **9 Code Animations** blocks: `code-typing` (live typing), `code-diff` (a change), `code-morph` (a refactor), `code-highlight` (spotlight a line; `line` is 0-based), `code-scroll` (walk a file), `code-snippet-flight` (assemble); GPU hero reveals `code-3d-extrude` / `code-shader-dissolve` / `code-particle-assemble` for a title-card moment; for a static themed code/terminal window use a `code-snippet-*` block | the baked code string / diff / theme | a code motion none cover |
|
|
21
|
+
| **brand reveal** | `logo-outro` (piece assembly + glow + tagline + URL pill) | logo asset, tagline, URL, palette | — |
|
|
22
|
+
| transitions | 15+ shader transitions (domain-warp, whip-pan, sdf-iris, glitch…) | direction, timing | — |
|
|
23
|
+
| social overlay | ig / tiktok / yt / x / reddit / spotify / macos cards | handle, metrics, avatar | — |
|
|
24
|
+
| polish | grain-overlay, vignette, shimmer-sweep, texture-mask-text | intensity | — |
|
|
25
|
+
| **asset-fusion (RWA)** | **annotation kit from `north-korea-locked-down`** — scribble-circle draw-on, pop-up pill + pointer, red-wash, scanline, corners, camera push; + `us-map-bubble` callouts/connectors | asset, annotation position (`element_positions`), label, palette **eyedropper'd from the asset** | **NET-NEW (not in catalog): the affordance binding — asset geometry _becomes_ the chart axis (straw → gauge)** |
|
|
26
|
+
|
|
27
|
+
## Reuse mechanics
|
|
28
|
+
|
|
29
|
+
- `npx hyperframes add <block>` → source lands in `compositions/<block>.html`; inline it or reference via `data-composition-src`; customize content/data/palette/positions in place.
|
|
30
|
+
- Blocks ship at fixed canvases (1920×1080 / 1080×1920 / 1080×1080) — match or adapt.
|
|
31
|
+
- Blocks already follow the HF contract (paused timeline, seek) — keep it.
|
|
32
|
+
|
|
33
|
+
## Asset-fusion: borrow + net-new (the only real net-new IP)
|
|
34
|
+
|
|
35
|
+
Borrow `north-korea-locked-down`'s annotation _language_; the net-new is the RWA fusion _logic_ (see the RWA study):
|
|
36
|
+
|
|
37
|
+
1. Classify the data type; read the asset's **geometric affordance** — linearity → timeline/gauge, volume/texture → pie, height → bar, container → exploded view.
|
|
38
|
+
2. **`element_positions`** — measure the asset's feature (center / extent / safe-zones / avoid-zones). This is the reverse-engineer step (vision); in the prototype it's hand-estimated.
|
|
39
|
+
3. **Eyedropper palette** from the asset (never generic #FFF/#000).
|
|
40
|
+
4. **Two layers** — asset (z0, full-bleed) + data graphics fused to its geometry (z1+), anchored by `element_positions`; connectors/scribble physically tie the data to the asset; the asset stays visible.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# asset-fusion — category module (search-driven · the net-new IP)
|
|
2
|
+
|
|
3
|
+
**A real asset's geometry _becomes_ the chart** — RWA diegetic fusion (the straw becomes a gauge; a glass's liquid becomes a pie). Not in any catalog; the genuinely net-new capability. ~5–8s.
|
|
4
|
+
|
|
5
|
+
## Source (Step 2)
|
|
6
|
+
|
|
7
|
+
Search or generate one **hero asset** with strong geometric affordance. `asset_needs`: `{ kind: image, query|generate, treatment: cutout|none }`. Freeze it project-local.
|
|
8
|
+
|
|
9
|
+
## Plan (Director Part 2) — the fusion logic
|
|
10
|
+
|
|
11
|
+
1. Classify the **data type** (temporal / quantitative / proportion / spatial).
|
|
12
|
+
2. Read the asset's **geometric affordance** — linearity → timeline/gauge · volume/texture → pie · height → bar · container → exploded view.
|
|
13
|
+
3. `element_positions`: **GROUND with the locate protocol — never eyeball pixel coords.** Read **`grounding/PROTOCOL.md`** and run the loop with `node grounding/locate.mjs` (`overlay` → read strips → `region` → read crop → `final` → **`mark` + verify**). Zero keys/deps assumed (node + ffmpeg only); the optional `auto` fast path exists only when `GEMINI_API_KEY` happens to be set. Why: eyeballing put rings off-subject (~16–24% center error on weak vision models); the grid loop pulls it to ~2–4% (measured E2E: eyeball 6.5% → protocol 2.3% avg center error, no case worse).
|
|
14
|
+
4. **Eyedropper palette** from the asset (never generic #FFF/#000).
|
|
15
|
+
|
|
16
|
+
## Highlight + circle recipe (the common case)
|
|
17
|
+
|
|
18
|
+
"Ring / spotlight object X in a real image" → use the drop-in template **`samples/asset-fusion/_ref-circle-highlight.html`**: set `CFG.box` (from the locate protocol), `CFG.label`, `CFG.asset`, EVEN `CFG.W/H`, `CFG.mode` (`full` = ring+connector+label+brackets+scanlines, `circle` = ring only). It computes the radial wash, the amber double over-stroke ring, connector, callout, and corner-bracket reticle from the box. The whole pipeline is: locate (PROTOCOL.md) → fill template → render.
|
|
19
|
+
|
|
20
|
+
## Render gotchas (codified — skipping these breaks the render)
|
|
21
|
+
|
|
22
|
+
- **EVEN width & height** — odd width _or height_ (e.g. 1400×933) → `ffmpeg` encode fails / distorts. Resize the asset/stage to even dims (1400×932).
|
|
23
|
+
- **`data-width`/`data-height` must be STATIC HTML attrs on the stage** — the renderer's StaticGuard reads them at compile time, before JS runs. Setting them via `setAttribute` is too late → render falls back to portrait 1080×1920 and distorts. (The circle-highlight template now hard-codes them; keep them equal to `CFG.W/H`.)
|
|
24
|
+
- **Draw-on (`stroke-dashoffset`) must be `autoAlpha:0`-gated** — `getTotalLength()` can read 0 before layout → dash disabled → a solid line shows at t=0. Gate every draw-on element with `autoAlpha:0` until it draws, and fall back `getTotalLength() || <const>`.
|
|
25
|
+
- **CSS var tween scope** — `gsap.to(":root", {"--x":..})` won't reach an element that has its own inline `--x`; tween the var on the element itself.
|
|
26
|
+
- **No camera push under a fixed overlay** — scaling the image while the ring/wash stay fixed drifts the target out of the ring. Either skip the push or scale the whole scene together.
|
|
27
|
+
- Lossless delivery: `--format mov` (ProRes); `mp4` is lossy.
|
|
28
|
+
|
|
29
|
+
## Vocabulary / leans on
|
|
30
|
+
|
|
31
|
+
- Borrow the annotation kit from registry **`north-korea-locked-down`** (hand-drawn scribble circle draw-on, pop-up label + pointer, editorial wash, camera push).
|
|
32
|
+
- Primitives: gauge fill / marker-rise along the affordance · connector (data → asset point) · diegetic chart fused to the asset's geometry.
|
|
33
|
+
- Adapt the diegetic chart to each asset's affordance (read the geometry, fuse the data into it).
|
|
34
|
+
|
|
35
|
+
## Build (reuse-first + hand-author the affordance)
|
|
36
|
+
|
|
37
|
+
**Two layers**: asset (z0, full-bleed) + data graphics (z1+) fused to its geometry, anchored by `element_positions`; connectors/scribble physically tie the data to the asset; asset stays visible. Reference impl: the prototype `fusion-demo/index-annotated.html` (straw → gauge + borrowed annotation kit).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# charts — category module
|
|
2
|
+
|
|
3
|
+
Animated **data-viz** from data. Asset-free (the "input" is the data). "One chart, one message" for short durations.
|
|
4
|
+
|
|
5
|
+
## Plan (Director)
|
|
6
|
+
|
|
7
|
+
`content`: `{ type: bar|line|pie|race|pct, data[], labels[], headline, axes: bool }`. For `race`, data must be cumulative/time-staged.
|
|
8
|
+
|
|
9
|
+
## Vocabulary / leans on
|
|
10
|
+
|
|
11
|
+
- Block: **`data-chart`** (animated **bar + line**, staggered reveal, value labels — proven: borrowed + customized + rendered to MP4 in the prototype `charts-demo`).
|
|
12
|
+
- Gaps (hand-author): **pie / donut, bar-chart-race, ring/%** — `data-chart` doesn't cover these. Use D3/visx for data→geometry + GSAP for motion.
|
|
13
|
+
- Signature animations: bar stagger-grow · line `stroke-dashoffset` draw-on · pie radial sweep · ring fill · KPI count-up · race reorder.
|
|
14
|
+
|
|
15
|
+
## Build (reuse-first)
|
|
16
|
+
|
|
17
|
+
Reuse `data-chart`: `npx hyperframes add data-chart` → edit the data arrays + scales + headline/labels + palette in place (its data is baked in the script, not a `--variables` flag). Axes hidden by default; show muted only when magnitude is the message. Determinism: drive any animation from the seek clock, never wall-clock.
|
|
18
|
+
|
|
19
|
+
## Dashboard-skeleton variant
|
|
20
|
+
|
|
21
|
+
For a **product-dashboard** case: lay out a skeleton dashboard — a top bar with a **real test logo** (e.g. the hyperframes logo in `samples/_assets/`) + a title, then a grid of 3–4 **KPI cards** (each a `stat` count-up) + one `data-chart` panel. Reveal order: header/logo in → cards stagger in → the chart animates. Composes the `stat` + `charts` primitives inside a dashboard frame; the logo is a frozen project-local asset.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# kinetic-type — category module
|
|
2
|
+
|
|
3
|
+
Text is the hero; typography + motion carry the message. Usually asset-free (`asset_needs: []`).
|
|
4
|
+
|
|
5
|
+
## Plan (Director)
|
|
6
|
+
|
|
7
|
+
- **Style first.** If the project has a **`design.md` / `frame.md`** (precedence: `frame.md` → `design.md` → `DESIGN.md`), READ it and use its **exact palette / fonts / constraints** — do not invent. No spec → pick a named style, or ask: mood + light/dark + any brand color/font. (Style is an input the case must exercise; the same shot in two `design.md`s should look different.)
|
|
8
|
+
- Segment the copy into scenes by meaning / breath (EN ~3–7 words; ZH ~4–12 chars). Tag each scene **Hook → Build → Punch → Resolve**.
|
|
9
|
+
- 1–2 `emphasis_words` per scene. Per scene: `emotion` + `motion` (free-form) + `beats`.
|
|
10
|
+
|
|
11
|
+
## Vocabulary
|
|
12
|
+
|
|
13
|
+
Motion primitives + registry blocks: **`references/motion-vocabulary.md`** (slide / scale / fade / blur / typewriter / word_reveal / wave / bounce / slam / scale_pulse / shake / glow / color_shift, plus the 18 `caption-*` blocks).
|
|
14
|
+
|
|
15
|
+
## Build (reuse-first)
|
|
16
|
+
|
|
17
|
+
- Prefer a **`caption-*` block** when one fits (`caption-kinetic-slam` / `caption-editorial-emphasis` / …): `npx hyperframes add` + set words / `emphasis_words` / palette / font.
|
|
18
|
+
- Else hand-author: one full-duration `.clip`; a `.group` per scene (flex-centered); words as spans; explicit `gsap.fromTo()` entrances per scene `motion`; emphasis words → `glow` / `scale_pulse` on the beat; seek-safe `autoAlpha` only on inner non-clip elements. Honor `references/builder-contract.md`.
|
|
19
|
+
- Reference impl: prototype `v0-text-motion-demo` + `pipeline-demo`.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# logo-reveal — category module
|
|
2
|
+
|
|
3
|
+
A **logo sting / brand lockup**. The logo is user-supplied, or resolved for a known brand (`resolve --type logo --entity <brand>`); `asset_needs` = one logo `source`. ~3–5s. Often `export: alpha-overlay` (sting to drop on other footage).
|
|
4
|
+
|
|
5
|
+
## Plan (Director)
|
|
6
|
+
|
|
7
|
+
`content`: `{ logo: <asset path>, tagline, url }`. Envelope: brand palette (or eyedropper from the logo), elegant pacing.
|
|
8
|
+
|
|
9
|
+
## Vocabulary / leans on
|
|
10
|
+
|
|
11
|
+
- Block: **`logo-outro`** (piece-by-piece assembly + glow bloom + tagline fade + URL pill).
|
|
12
|
+
- Rules: `rules/svg-path-draw` (draw-on for vector logos) · `rules/scale-swap-transition` · `rules/3d-text-depth-layers`.
|
|
13
|
+
- Primitives: draw-on / mask-reveal / particle-assemble · `glow` bloom · `underline_sweep` · hold.
|
|
14
|
+
|
|
15
|
+
## Build (reuse-first)
|
|
16
|
+
|
|
17
|
+
Reuse `logo-outro` + swap logo / tagline / url / palette; **or** hand-author: place the logo at its hero frame (CSS), reveal via draw-on (SVG `stroke-dashoffset`) or mask/scale, add a glow bloom + accent underline sweep, hold. For an SVG logo, prefer draw-on; for a raster logo, mask/scale + glow. Transparent bg when exporting as an overlay.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# lower-thirds — category module
|
|
2
|
+
|
|
3
|
+
**Name/title bars, callouts, social overlays** — graphics meant to sit over other footage. Asset-free (+ optional logo). Usually `export: alpha-overlay` (transparent). ~3–6s (or loop/hold).
|
|
4
|
+
|
|
5
|
+
## Plan (Director)
|
|
6
|
+
|
|
7
|
+
`content`: `{ name, role, position (lower-left / lower-third / corner), brand_colors[] }`. Default `export: alpha-overlay`.
|
|
8
|
+
|
|
9
|
+
## Vocabulary / leans on
|
|
10
|
+
|
|
11
|
+
- Blocks: `caption-*` (pill-karaoke, neon-accent, editorial-emphasis) + registry **overlay** blocks (`instagram-follow`, `tiktok-follow`, `yt-lower-third`, `x-post`, `spotify-card`, `macos-notification`).
|
|
12
|
+
- Primitives: slide/wipe-in · bar reveal · `glow` · fade/slide-out.
|
|
13
|
+
|
|
14
|
+
## Build (reuse-first)
|
|
15
|
+
|
|
16
|
+
Reuse the closest overlay/caption block + set name / role / handle / brand colors / position; **or** hand-author a bar that wipes in (`scaleX` from 0, `transform-origin:left`) with text sliding up behind it, hold, slide out. **Transparent background** (`export: alpha-overlay` → `render --format webm/mov`) so it composites over footage. Keep it in the title-safe lower band.
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
// bake-basemap.mjs — canonical basemap-lane helper for the `maps` skill.
|
|
2
|
+
//
|
|
3
|
+
// WHAT IT DOES (and why baking at all): drives MapLibre in headless Chrome to record ONLY the
|
|
4
|
+
// real-imagery basemap as an MP4 (camera zoom→hold), and projects each requested country's border
|
|
5
|
+
// to SCREEN coordinates at the held view. The HF composition then plays the MP4 on track 0 and
|
|
6
|
+
// animates a *live* SVG overlay (border draw-on, colour-block / flag fills, labels, pins) from the
|
|
7
|
+
// exported `coords.json`. Borders/fills are NOT baked into the video — they stay editable in HF.
|
|
8
|
+
//
|
|
9
|
+
// Why bake the imagery at all (this is the real reason, not "smoothness"): HF forbids render-time
|
|
10
|
+
// network and requires deterministic output. Live raster tiles re-fetch every render and can change
|
|
11
|
+
// → non-deterministic. Baking FREEZES the imagery into pixels = deterministic + offline-reproducible.
|
|
12
|
+
// (Exposing the engine's per-frame `onBeforeCapture` hook would let MapLibre run live and smooth, but
|
|
13
|
+
// it would NOT remove the need to freeze tiles for determinism — so this bake step stays relevant.)
|
|
14
|
+
//
|
|
15
|
+
// PARAMETRIC — drive everything by env. Example (Brazil + Argentina on satellite):
|
|
16
|
+
// NAME=br-ar STYLE=satellite COUNTRIES="Brazil:#22d3ee,Argentina:#f59e0b" \
|
|
17
|
+
// CENTER="-60,-25" ZSTART=2.4 ZEND=3.4 FPS=30 DUR=5 node bake-basemap.mjs
|
|
18
|
+
// Then encode frames-<NAME>/f%04d.png → <NAME>.mp4 (all-intra: -g 1) and feed <NAME>-coords.json
|
|
19
|
+
// to the HF composition.
|
|
20
|
+
import puppeteer from "puppeteer-core";
|
|
21
|
+
import { fileURLToPath } from "node:url";
|
|
22
|
+
import { dirname, join } from "node:path";
|
|
23
|
+
import { mkdirSync, writeFileSync, readdirSync, existsSync } from "node:fs";
|
|
24
|
+
import { homedir } from "node:os";
|
|
25
|
+
import { spawnSync } from "node:child_process";
|
|
26
|
+
|
|
27
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
28
|
+
|
|
29
|
+
// --- resolve Chrome dynamically (no hardcoded machine path) ---
|
|
30
|
+
function resolveChrome() {
|
|
31
|
+
if (process.env.CHROME && existsSync(process.env.CHROME)) return process.env.CHROME;
|
|
32
|
+
const exe = process.platform === "win32" ? "chrome-headless-shell.exe" : "chrome-headless-shell";
|
|
33
|
+
const base = join(homedir(), ".cache", "puppeteer", "chrome-headless-shell");
|
|
34
|
+
if (existsSync(base)) {
|
|
35
|
+
for (const v of readdirSync(base).sort().reverse()) {
|
|
36
|
+
// lexical sort; any working binary is fine
|
|
37
|
+
try {
|
|
38
|
+
for (const inner of readdirSync(join(base, v))) {
|
|
39
|
+
const bin = join(base, v, inner, exe);
|
|
40
|
+
if (existsSync(bin)) return bin;
|
|
41
|
+
}
|
|
42
|
+
} catch {
|
|
43
|
+
/* skip */
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
for (const c of [
|
|
48
|
+
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
49
|
+
"/usr/bin/google-chrome",
|
|
50
|
+
"/usr/bin/chromium",
|
|
51
|
+
"/usr/bin/chromium-browser",
|
|
52
|
+
])
|
|
53
|
+
if (existsSync(c)) return c;
|
|
54
|
+
throw new Error(
|
|
55
|
+
"Chrome not found. Set CHROME=/path/to/chrome-headless-shell, or install one:\n" +
|
|
56
|
+
" npx puppeteer browsers install chrome-headless-shell",
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// --- params (all overridable by env) ---
|
|
61
|
+
const NAME = process.env.NAME || "basemap";
|
|
62
|
+
const STYLE = process.env.STYLE || "satellite"; // satellite | dark | light | raw {z}/{x}/{y} template
|
|
63
|
+
const CENTER = (process.env.CENTER || "2.6,46.6").split(",").map(Number);
|
|
64
|
+
const ZSTART = +(process.env.ZSTART || 4.2);
|
|
65
|
+
const ZEND = +(process.env.ZEND || 5.4);
|
|
66
|
+
const PITCH = +(process.env.PITCH || 0);
|
|
67
|
+
const BEARING = +(process.env.BEARING || 0);
|
|
68
|
+
const FPS = +(process.env.FPS || 30),
|
|
69
|
+
DUR = +(process.env.DUR || 5),
|
|
70
|
+
N = Math.max(1, Math.round(FPS * DUR));
|
|
71
|
+
const HOLD = +(process.env.HOLD || 0.5); // p∈[0,1] at which the zoom finishes; camera holds after
|
|
72
|
+
const MARGIN = (process.env.KEEPMARGIN || "16,13").split(",").map(Number); // [lon°,lat°] keep-box around each country's mainland
|
|
73
|
+
// COUNTRIES="Name:#hex,Name:#hex" — borders to project (optional; omit for a pure zoom-to / pin shot)
|
|
74
|
+
const COUNTRIES = (process.env.COUNTRIES || "")
|
|
75
|
+
.split(",")
|
|
76
|
+
.map((s) => s.trim())
|
|
77
|
+
.filter(Boolean)
|
|
78
|
+
.map((s) => {
|
|
79
|
+
const [name, color] = s.split(":");
|
|
80
|
+
return { name, color: color || "#38bdf8" };
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// fail fast on bad numeric env — otherwise NaN silently bakes zero/garbage frames and still prints "done"
|
|
84
|
+
for (const [k, v] of Object.entries({
|
|
85
|
+
"CENTER.lng": CENTER[0],
|
|
86
|
+
"CENTER.lat": CENTER[1],
|
|
87
|
+
ZSTART,
|
|
88
|
+
ZEND,
|
|
89
|
+
PITCH,
|
|
90
|
+
BEARING,
|
|
91
|
+
FPS,
|
|
92
|
+
DUR,
|
|
93
|
+
HOLD,
|
|
94
|
+
}))
|
|
95
|
+
if (!Number.isFinite(v))
|
|
96
|
+
throw new Error(
|
|
97
|
+
`bad numeric env: ${k}=${v} — check CENTER="lng,lat" / ZSTART / ZEND / FPS / DUR`,
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
// IMPORTANT: tileSize:256 matches Esri/CARTO raster endpoints. MapLibre's INTERNAL world width is
|
|
101
|
+
// 512·2^zoom regardless — a 512px (@2x/retina/vector) tile source needs tileSize:512 or every zoom
|
|
102
|
+
// level is off by one. Keep 256 for these raster sources.
|
|
103
|
+
const TILES =
|
|
104
|
+
{
|
|
105
|
+
satellite:
|
|
106
|
+
"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",
|
|
107
|
+
dark: "https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png",
|
|
108
|
+
light: "https://a.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
|
|
109
|
+
}[STYLE] || STYLE; // STYLE may also be a raw {z}/{x}/{y} template
|
|
110
|
+
|
|
111
|
+
const OUT = process.env.OUT || process.cwd(); // artifacts → workspace (cwd), NOT the installed skill dir
|
|
112
|
+
const framesDir = join(OUT, "frames-" + NAME);
|
|
113
|
+
mkdirSync(framesDir, { recursive: true });
|
|
114
|
+
|
|
115
|
+
// Deps PINNED exact (mutable @5/@2 majors would drift the bake over time).
|
|
116
|
+
const PAGE = `<!doctype html><html><head>
|
|
117
|
+
<link href="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.css" rel="stylesheet">
|
|
118
|
+
<script src="https://cdn.jsdelivr.net/npm/maplibre-gl@5.24.0/dist/maplibre-gl.js"></script>
|
|
119
|
+
<script src="https://cdn.jsdelivr.net/npm/topojson-client@3.1.0/dist/topojson-client.min.js"></script>
|
|
120
|
+
<style>*{margin:0}html,body{width:1920px;height:1080px;overflow:hidden;background:#05070d}#map{width:1920px;height:1080px}.maplibregl-control-container{display:none!important}</style>
|
|
121
|
+
</head><body><div id="map"></div><script>
|
|
122
|
+
var CENTER=${JSON.stringify(CENTER)}, ZSTART=${ZSTART}, ZEND=${ZEND}, PITCH=${PITCH}, BEARING=${BEARING}, HOLD=${HOLD};
|
|
123
|
+
var MARGIN=${JSON.stringify(MARGIN)}, WANT=${JSON.stringify(COUNTRIES)};
|
|
124
|
+
var map=new maplibregl.Map({container:"map",style:{version:8,projection:{type:"mercator"},
|
|
125
|
+
sources:{s:{type:"raster",tiles:[${JSON.stringify(TILES)}],tileSize:256,maxzoom:19}},
|
|
126
|
+
layers:[{id:"bg",type:"background",paint:{"background-color":"#05070d"}},{id:"s",type:"raster",source:"s"}]},
|
|
127
|
+
center:CENTER,zoom:ZSTART,pitch:0,bearing:0,interactive:false,attributionControl:false,fadeDuration:0,preserveDrawingBuffer:true,maxTileCacheSize:6000});
|
|
128
|
+
function ease(x){return x<0.5?4*x*x*x:1-Math.pow(-2*x+2,3)/2;} // easeInOutCubic (= Remotion interpolate+Easing)
|
|
129
|
+
function camAt(p){ var t=ease(Math.min(1,p/HOLD)); return {center:CENTER, zoom:ZSTART+(ZEND-ZSTART)*t, pitch:PITCH*t, bearing:BEARING*t}; }
|
|
130
|
+
function ringCentroid(r){ var sx=0,sy=0; for(var k=0;k<r.length;k++){sx+=r[k][0];sy+=r[k][1];} return [sx/r.length, sy/r.length]; }
|
|
131
|
+
// Keep the polygons in a lon/lat box around the country's MAINLAND (the vertex-richest polygon),
|
|
132
|
+
// dropping far-flung overseas territories that would blow up the bbox. Generalizes per subject —
|
|
133
|
+
// no continent-specific constant. Keeps near islands (Corsica, Sicily); drops Guiana, Alaska, Hawaii.
|
|
134
|
+
function mainland(f){
|
|
135
|
+
if(!f) return f;
|
|
136
|
+
if(f.geometry.type!=="MultiPolygon"){ f.__anchorRing=f.geometry.coordinates[0]; return f; } // Polygon: outer ring
|
|
137
|
+
var polys=f.geometry.coordinates, anchor=polys[0], amax=-1;
|
|
138
|
+
polys.forEach(function(poly){ if(poly[0].length>amax){amax=poly[0].length;anchor=poly;} });
|
|
139
|
+
var ac=ringCentroid(anchor[0]);
|
|
140
|
+
var kept=polys.filter(function(poly){ var c=ringCentroid(poly[0]); return Math.abs(c[0]-ac[0])<=MARGIN[0] && Math.abs(c[1]-ac[1])<=MARGIN[1]; });
|
|
141
|
+
var nf={type:"Feature",properties:f.properties,geometry:{type:"MultiPolygon",coordinates:kept}}; nf.__anchorRing=anchor[0]; return nf;
|
|
142
|
+
}
|
|
143
|
+
function lonSpan(f){ var mn=1e9,mx=-1e9; (f.geometry.type==="Polygon"?[f.geometry.coordinates]:f.geometry.coordinates).forEach(function(poly){poly[0].forEach(function(c){if(c[0]<mn)mn=c[0];if(c[0]>mx)mx=c[0];});}); return mx-mn; }
|
|
144
|
+
// ANTIMERIDIAN unwrap (Russia/Fiji/NZ): make all lon contiguous around the camera-center ref so a
|
|
145
|
+
// feature touching ±180° doesn't smear when map.project() runs per-vertex (mercatorX is linear and
|
|
146
|
+
// accepts out-of-range lon, so 181 sits just east of center, not far-west at -179). Mutates in place;
|
|
147
|
+
// __anchorRing shares the same arrays so it's covered.
|
|
148
|
+
function unwrapLon(f, ref){ if(!f) return; function fix(r){ for(var i=0;i<r.length;i++){ var lon=r[i][0]; while(lon-ref>180)lon-=360; while(lon-ref<-180)lon+=360; r[i][0]=lon; } }
|
|
149
|
+
var g=f.geometry; if(g.type==="Polygon") g.coordinates.forEach(fix); else g.coordinates.forEach(function(poly){ poly.forEach(fix); }); }
|
|
150
|
+
var FEATS=[]; window.__warn=[];
|
|
151
|
+
window.__ready=new Promise(function(res){ map.on("load", function(){
|
|
152
|
+
if(!WANT.length){ res(); return; }
|
|
153
|
+
fetch("https://cdn.jsdelivr.net/npm/world-atlas@2.0.2/countries-110m.json").then(function(r){return r.json();}).then(function(w){
|
|
154
|
+
var fc=topojson.feature(w,w.objects.countries);
|
|
155
|
+
WANT.forEach(function(want){
|
|
156
|
+
var f=fc.features.filter(function(x){return x.properties.name===want.name;})[0];
|
|
157
|
+
if(!f){ window.__warn.push("country not found in world-atlas: "+want.name); return; }
|
|
158
|
+
f=mainland(f);
|
|
159
|
+
unwrapLon(f, CENTER[0]); // antimeridian: unwrap lons around the camera ref (CENTER must be near the subject) before projecting
|
|
160
|
+
if(lonSpan(f)>180) window.__warn.push(want.name+" spans >180° lon even after unwrap — projection may still smear.");
|
|
161
|
+
FEATS.push({name:want.name, color:want.color, f:f});
|
|
162
|
+
});
|
|
163
|
+
res();
|
|
164
|
+
});
|
|
165
|
+
});});
|
|
166
|
+
window.__setCam=function(p){ map.jumpTo(camAt(p)); };
|
|
167
|
+
// returns true if the idle event did NOT fire within ms (i.e. tiles may be incomplete)
|
|
168
|
+
// returns true only if tiles are GENUINELY not loaded at timeout — CARTO/Esri idle is flaky and
|
|
169
|
+
// often never fires even when every tile is painted, so check areTilesLoaded() before crying timeout.
|
|
170
|
+
window.__waitIdle=function(ms){ return new Promise(function(res){ var done=false; function fin(t){if(done)return;done=true;res(t);} map.once("idle",function(){fin(false);}); setTimeout(function(){ fin(!map.areTilesLoaded()); }, ms||9000); }); };
|
|
171
|
+
function featurePath(f){ function ring(r){ return r.map(function(c,i){ var p=map.project(c); return (i?"L":"M")+p.x.toFixed(1)+" "+p.y.toFixed(1); }).join(" ")+"Z"; }
|
|
172
|
+
var g=f.geometry,d=""; if(g.type==="Polygon") g.coordinates.forEach(function(r){d+=ring(r);}); else g.coordinates.forEach(function(poly){poly.forEach(function(r){d+=ring(r);});}); return d; }
|
|
173
|
+
function bboxOf(f){ var mnx=1e9,mny=1e9,mxx=-1e9,mxy=-1e9;
|
|
174
|
+
function eat(r){ r.forEach(function(c){ var p=map.project(c); if(p.x<mnx)mnx=p.x; if(p.y<mny)mny=p.y; if(p.x>mxx)mxx=p.x; if(p.y>mxy)mxy=p.y; }); }
|
|
175
|
+
var g=f.geometry; if(g.type==="Polygon")g.coordinates.forEach(eat); else g.coordinates.forEach(function(poly){poly.forEach(eat);});
|
|
176
|
+
return {x:+mnx.toFixed(1),y:+mny.toFixed(1),w:+(mxx-mnx).toFixed(1),h:+(mxy-mny).toFixed(1)}; }
|
|
177
|
+
window.__project=function(){ return {
|
|
178
|
+
view:{center:CENTER, zoom:ZEND, pitch:PITCH, bearing:BEARING},
|
|
179
|
+
countries: FEATS.map(function(e){ var lc=ringCentroid(e.f.__anchorRing); var lp=map.project(lc);
|
|
180
|
+
return { name:e.name, color:e.color, d:featurePath(e.f), bbox:bboxOf(e.f), label:{x:+lp.x.toFixed(1),y:+lp.y.toFixed(1)} }; }),
|
|
181
|
+
}; };
|
|
182
|
+
</script></body></html>`;
|
|
183
|
+
|
|
184
|
+
// --no-sandbox is intentional: trusted Source-time bake, headless, often root/CI; deps are version-pinned above.
|
|
185
|
+
const browser = await puppeteer.launch({
|
|
186
|
+
executablePath: resolveChrome(),
|
|
187
|
+
headless: true,
|
|
188
|
+
args: [
|
|
189
|
+
"--no-sandbox",
|
|
190
|
+
"--hide-scrollbars",
|
|
191
|
+
"--use-gl=angle",
|
|
192
|
+
"--use-angle=swiftshader",
|
|
193
|
+
"--enable-unsafe-swiftshader",
|
|
194
|
+
"--enable-webgl",
|
|
195
|
+
"--window-size=1920,1080",
|
|
196
|
+
],
|
|
197
|
+
});
|
|
198
|
+
try {
|
|
199
|
+
const page = await browser.newPage();
|
|
200
|
+
await page.setViewport({ width: 1920, height: 1080, deviceScaleFactor: 1 });
|
|
201
|
+
await page.setContent(PAGE, { waitUntil: "load" });
|
|
202
|
+
await page.evaluate(() => window.__ready);
|
|
203
|
+
for (const w of await page.evaluate(() => window.__warn)) console.warn(`[${NAME}] WARN: ${w}`);
|
|
204
|
+
console.log(
|
|
205
|
+
`[${NAME}] ready (${STYLE}); baking ${N} frames, zoom ${ZSTART}→${ZEND} hold@p=${HOLD}, ${COUNTRIES.length} border(s)`,
|
|
206
|
+
);
|
|
207
|
+
let coords = null;
|
|
208
|
+
const timeouts = [];
|
|
209
|
+
for (let i = 0; i < N; i++) {
|
|
210
|
+
const p = N === 1 ? 1 : i / (N - 1);
|
|
211
|
+
await page.evaluate((pp) => window.__setCam(pp), p);
|
|
212
|
+
const timedOut = await page.evaluate((ms) => window.__waitIdle(ms), 9000);
|
|
213
|
+
if (timedOut) {
|
|
214
|
+
timeouts.push(i);
|
|
215
|
+
console.warn(`[${NAME}] idle TIMEOUT at frame ${i} — tiles may be incomplete`);
|
|
216
|
+
}
|
|
217
|
+
await page.screenshot({
|
|
218
|
+
path: join(framesDir, `f${String(i).padStart(4, "0")}.png`),
|
|
219
|
+
clip: { x: 0, y: 0, width: 1920, height: 1080 },
|
|
220
|
+
optimizeForSpeed: true,
|
|
221
|
+
});
|
|
222
|
+
if (p >= HOLD && !coords && COUNTRIES.length)
|
|
223
|
+
coords = await page.evaluate(() => window.__project()); // capture at first hold frame
|
|
224
|
+
if (i % 20 === 0 || i === N - 1) console.log(` [${NAME}] ${i + 1}/${N}`);
|
|
225
|
+
}
|
|
226
|
+
// encode frames → all-intra MP4 (every frame seekable for HF); fall back to printing the command if ffmpeg is absent
|
|
227
|
+
const mp4 = join(OUT, NAME + ".mp4"),
|
|
228
|
+
pat = join(framesDir, "f%04d.png");
|
|
229
|
+
const ff = spawnSync(
|
|
230
|
+
"ffmpeg",
|
|
231
|
+
[
|
|
232
|
+
"-y",
|
|
233
|
+
"-framerate",
|
|
234
|
+
String(FPS),
|
|
235
|
+
"-i",
|
|
236
|
+
pat,
|
|
237
|
+
"-c:v",
|
|
238
|
+
"libx264",
|
|
239
|
+
"-pix_fmt",
|
|
240
|
+
"yuv420p",
|
|
241
|
+
"-g",
|
|
242
|
+
"1",
|
|
243
|
+
"-crf",
|
|
244
|
+
"16",
|
|
245
|
+
"-movflags",
|
|
246
|
+
"+faststart",
|
|
247
|
+
mp4,
|
|
248
|
+
],
|
|
249
|
+
{ stdio: "ignore" },
|
|
250
|
+
);
|
|
251
|
+
if (ff.status === 0) console.log(`[${NAME}] encoded → ${mp4}`);
|
|
252
|
+
else
|
|
253
|
+
console.warn(
|
|
254
|
+
`[${NAME}] ffmpeg unavailable (status ${ff.status}) — encode manually:\n ffmpeg -y -framerate ${FPS} -i ${pat} -c:v libx264 -pix_fmt yuv420p -g 1 -crf 16 -movflags +faststart ${mp4}`,
|
|
255
|
+
);
|
|
256
|
+
if (coords) {
|
|
257
|
+
writeFileSync(join(OUT, NAME + "-coords.json"), JSON.stringify(coords));
|
|
258
|
+
console.log(
|
|
259
|
+
`[${NAME}] coords written: ${coords.countries.map((c) => c.name + "(" + c.d.length + "ch)").join(", ")}`,
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
if (timeouts.length) {
|
|
263
|
+
// FAIL LOUD: the asset exists but is suspect — don't let a half-loaded bake pass silently
|
|
264
|
+
console.error(
|
|
265
|
+
`[${NAME}] ${timeouts.length}/${N} frame(s) hit the idle timeout (frames ${timeouts.slice(0, 8).join(",")}${timeouts.length > 8 ? "…" : ""}). The basemap MP4 may have INCOMPLETE tiles. Re-run with a slower zoom / larger timeout / check the tile server.`,
|
|
266
|
+
);
|
|
267
|
+
process.exitCode = 1;
|
|
268
|
+
} else {
|
|
269
|
+
console.log(`[${NAME}] done — all ${N} frames reached map idle (complete tiles).`);
|
|
270
|
+
}
|
|
271
|
+
} finally {
|
|
272
|
+
await browser.close();
|
|
273
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# maps — category module
|
|
2
|
+
|
|
3
|
+
Geographic motion: highlight regions, connect places, zoom to a location. **First decision: does the shot need a real basemap** (satellite/street/terrain imagery, globe, or zoom to a real address)? That picks the lane.
|
|
4
|
+
|
|
5
|
+
## Plan (Director)
|
|
6
|
+
|
|
7
|
+
Set `content.lane` first:
|
|
8
|
+
|
|
9
|
+
- **vector** (default) — stylized region shapes, no real imagery. Native + live in HF, cheap. `asset_needs: []`.
|
|
10
|
+
- **basemap** — needs real satellite/dark tiles, globe, or zoom-to-real-place. `asset_needs: [{ type: "map-bake", … }]`. **Bake the imagery in Source**: HF forbids render-time network and requires determinism, so live tiles (which re-fetch and can change per render) can't be the imagery layer — baking freezes it (and is smooth as a bonus). See Basemap lane + Determinism.
|
|
11
|
+
|
|
12
|
+
`content`: `{ lane, shot: highlight|flow|choropleth|labels|flag|pin-rollout|zoom-to, regions[], points[], basemap: satellite|dark, palette, headline, overlays: [label|pin|callout-card] }`.
|
|
13
|
+
|
|
14
|
+
`overlays` are independent of `shot` and work in both lanes. **`callout-card`** = a pinned card (flag chip + stat + progress bar) — this is the "documentary popup" (top #13); compose it on any zoom-to/highlight shot rather than treating it as its own shot.
|
|
15
|
+
|
|
16
|
+
## Vocabulary / leans on
|
|
17
|
+
|
|
18
|
+
**Vector lane** (D3 + TopoJSON — reuse the existing map family, don't duplicate):
|
|
19
|
+
|
|
20
|
+
- Reuse: `us-map` (+bubble/hex/flow), `world-map`, `spain-map`.
|
|
21
|
+
- **Hand-author** these (NOT in the catalog — build per the signatures below, don't expect an `add`): `geo-highlight` (N countries colored + labels + border pulse), `geo-flow` (world arcs / hub network), `flag-borders` (flag clipped to a country), `pin-rollout` (cities pulse in sequence + counter).
|
|
22
|
+
- Signature: country fill-in stagger · pin drop + pulse ring · arc `stroke-dashoffset` draw-on + flyer · choropleth color reveal · **viewBox** zoom.
|
|
23
|
+
|
|
24
|
+
**Basemap lane** (MapLibre, baked in Source — validated pipeline, `bake-basemap.mjs`, fully env-parametric — runs for any country, not just the prototypes):
|
|
25
|
+
|
|
26
|
+
- **Bake** `bake-basemap.mjs` (puppeteer + MapLibre; env-driven: `NAME STYLE COUNTRIES CENTER ZSTART ZEND PITCH BEARING FPS DUR`): drive the camera **zoom→hold** (`easeInOutCubic`) and **`await map.once('idle')` before every frame** so each frame has complete tiles (Remotion `delayRender` technique → no tile pop). The helper resolves Chrome itself, pins deps exactly, derives the overseas-territory filter per subject, and **fails loud on idle-timeout** (suspect frames → non-zero exit). _External deps: the pinned CDN libs (maplibre/topojson/world-atlas) + the Esri/CARTO tile endpoints are third-party — re-verify availability + ToS on any version bump._ `preserveDrawingBuffer:true`, `fadeDuration:0`. The helper then **encodes the frames to an all-intra MP4 itself** (`ffmpeg -framerate FPS -i f%04d.png -c:v libx264 -g 1 -pix_fmt yuv420p`) and writes everything to **`$OUT` (default `cwd`)**, not the skill dir → `<NAME>.mp4` + `<NAME>-coords.json`.
|
|
27
|
+
- **Export geo→screen** at the hold view: `map.project()` each requested country → `<NAME>-coords.json` = `{ view, countries: [{ name, color, d (SVG path), bbox, label }] }`. The camera holds static after the zoom, so these paths stay pixel-aligned. `label` is an **approximate** anchor (vertex-average of the mainland ring — for concave countries nudge per Legibility). Consume `coords.countries[i]`; the `smooth-frde2`/`smooth-flag` example dirs predate this helper and use a flat `{fr,de,…}` shape, so adapt their wiring.
|
|
28
|
+
- **Builder**: `<video>` basemap on track 0 + an **SVG overlay** that, during the hold, animates country **borders (`stroke-dashoffset` draw-on)** + **fills (colour-block reveal)** + labels/pins/cards — all geo-aligned via `coords.json`. This reproduces the Hera "satellite + animated coloured borders/callouts" look.
|
|
29
|
+
- The same projected path also doubles as an SVG **`clipPath`**: clip a **flag (or any texture) into the real border** for _flag-in-borders_ — a richer fill than flat colour, over real map context (validated: France tricolor over a dark basemap, `smooth-flag`). Export the feature's screen **bbox** alongside its path so the flag stripes/texture can be sized to the country.
|
|
30
|
+
- **Stretch / data gaps** (extend `bake-basemap.mjs` as needed — the eval agents did): a **globe intro** ("start from the globe") = MapLibre `projection:{type:'globe'}` for the opening phase, easing to mercator at the target (the helper defaults to mercator). **Sub-national** regions (states/provinces) aren't in world-atlas (country-only) → use a Natural Earth **admin-1** TopoJSON, or project centroids as pins (`pin-rollout`).
|
|
31
|
+
|
|
32
|
+
## Build (reuse-first)
|
|
33
|
+
|
|
34
|
+
Vector: `npx hyperframes add <block>` → edit regions/data/palette in place. Basemap: baked `map.mp4` as track-0 `<video>`, bind overlays to anchors.
|
|
35
|
+
|
|
36
|
+
**Restraint (no cheese — this is the #1 way auto-built maps go wrong):** every animated element must serve the message — region, connector, label, pin, camera. **NO decorative ambient glows, background light blobs, floating particles, lens flares, or gratuitous bloom.** Motion = a continuous camera move (viewBox push/zoom) + purposeful, overlapping element reveals — not a light show. Palette: color must **carry meaning** — a data scale (choropleth), categorical fills that distinguish regions (political map), or 1–2 accents for the subjects (highlighted countries / route) over neutral everything-else. Don't add color as **decoration** (a country amber just for contrast, a glow for "energy"). The frame should read like a clean broadcast map, not a screensaver.
|
|
37
|
+
|
|
38
|
+
**Legibility (hard rule):** offset labels from the highlighted shape and from each other; clamp to the safe area; a callout pill must not sit on another label or a border (the eval surfaced a DE/PL "Oder–Neisse" pill overlapping the POLAND label). A key element stays readable ≥~0.3s.
|
|
39
|
+
|
|
40
|
+
**Attribution (hard rule):** real basemap imagery carries usage terms — bake a credit element into the composition whenever a basemap is on screen (Esri satellite → "Esri, Maxar, Earthstar Geographics"; CARTO → "© CARTO, © OpenStreetMap"). A small low-corner label (see `smooth-jp`). Non-negotiable for anything published.
|
|
41
|
+
|
|
42
|
+
**Determinism (hard rules — each one bit us in the prototypes):**
|
|
43
|
+
|
|
44
|
+
- Drive everything from the seek clock; **never `tl.call`** for stateful updates (counters, text) → proxy tween + `onUpdate` (tl.call freezes the timeline under HF seek).
|
|
45
|
+
- SVG zoom = animate **viewBox** (don't hand-compute group transform origins).
|
|
46
|
+
- Centered overlays (cards/labels using `transform: translate(-50%,…)` to center): animate **opacity only**, or wrap in an outer centered div — GSAP animating `y`/`scale` overwrites the whole transform and kills the centering.
|
|
47
|
+
- Country geometry: filter to the polygon(s) **in a lon/lat box around the subject** — world-atlas bundles overseas territories that blow up the bbox (France + Guiana). Keep near islands (Corsica, Sicily), drop far ones. (`bake-basemap.mjs` anchors on the vertex-richest polygon ± `KEEPMARGIN` — no continent-specific constant.)
|
|
48
|
+
- **Tile world-scale**: MapLibre's internal world width is `512·2^zoom` regardless of the raster `tileSize`. Esri/CARTO raster → `tileSize:256` (correct); a 512px / @2x / retina / vector source needs `tileSize:512` or every zoom level is off by one (this silently over-zoomed a bake once — France overflowed the frame top-to-bottom).
|
|
49
|
+
- **Antimeridian**: a feature crossing ±180° (Russia, Fiji, NZ) smears under per-vertex `map.project()`. `bake-basemap.mjs` **unwraps longitudes around the camera-center ref** before projecting, which handles it; it still warns if a feature spans >180° even after unwrap.
|
|
50
|
+
- **Smoothness = per-frame complete tiles + eased camera.** In the bake, `await map.once('idle')` before each screenshot (= Remotion `delayRender`) and ease the camera with `easeInOutCubic` (= interpolate+Easing). `preserveDrawingBuffer:true`, `fadeDuration:0`, large `maxTileCacheSize`.
|
|
51
|
+
- **Overlay alignment**: project feature borders at a **held** camera and only animate the overlay during the hold — a moving camera + a fixed projected path drift apart.
|
|
52
|
+
- **Pre-hold hidden state**: an overlay revealed _at_ the hold must be `gsap.set` to its hidden state at build time (`scaleX:0`, full `stroke-dashoffset`, `opacity:0`) — a bare `fromTo` does **not** apply its "from" until the tween starts, so the element otherwise shows at its natural (visible, mispositioned) state during the zoom-in.
|
|
53
|
+
- **Why bake at all** (the real reason — not just smoothness): baking freezes the imagery into **deterministic** pixels. Live raster tiles re-fetch every render and can change, and render-time network is forbidden. MapLibre _does_ render live in HF (just janky: tiles pop, deep zooms outrun loading); exposing the engine's per-frame `onBeforeCapture` hook (it exists — `frameCapture.ts:~1250`) would make live **smooth** — but it would **not** remove the need to freeze tiles for **determinism + offline reproducibility**. So `onBeforeCapture` would replace the _smoothness_ role of baking, not the _freeze_ role.
|
|
54
|
+
|
|
55
|
+
## Out of scope
|
|
56
|
+
|
|
57
|
+
3D photorealistic landmarks (Cesium territory) · per-country / per-template blocks (parametrize instead) · charts (→ `charts`). (In-engine _live_ MapLibre is possible but janky today — bake instead; revisit if the engine gains a per-frame ready hook.)
|
|
58
|
+
|
|
59
|
+
## Register
|
|
60
|
+
|
|
61
|
+
`director.md` classifier line (the lane fork) + `catalog-map.md` `maps/geo` row (add the basemap lane). Phase pipeline untouched.
|