@mevdragon/vidfarm-devcli 0.14.0 → 0.15.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/.agents/skills/embedded-captions/CATALOG.md +93 -0
- package/.agents/skills/embedded-captions/SKILL.md +286 -0
- package/.agents/skills/embedded-captions/assets/brand/CDPR-fankit-terms.txt +35 -0
- package/.agents/skills/embedded-captions/assets/brand/cyberpunk-widths.json +115 -0
- package/.agents/skills/embedded-captions/assets/fonts/char-widths.json +2211 -0
- package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +242 -0
- package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +242 -0
- package/.agents/skills/embedded-captions/dna/README.md +148 -0
- package/.agents/skills/embedded-captions/dna/chrome.json +68 -0
- package/.agents/skills/embedded-captions/dna/cream.json +69 -0
- package/.agents/skills/embedded-captions/dna/documentary.json +62 -0
- package/.agents/skills/embedded-captions/dna/editorial.json +70 -0
- package/.agents/skills/embedded-captions/dna/glitch.json +82 -0
- package/.agents/skills/embedded-captions/dna/ink.json +65 -0
- package/.agents/skills/embedded-captions/dna/keynote.json +62 -0
- package/.agents/skills/embedded-captions/dna/loud.json +75 -0
- package/.agents/skills/embedded-captions/dna/neon.json +58 -0
- package/.agents/skills/embedded-captions/dna/velocity.json +89 -0
- package/.agents/skills/embedded-captions/modes/cinematic/README.md +48 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +98 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +188 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +134 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +179 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +81 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +170 -0
- package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +16 -0
- package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +226 -0
- package/.agents/skills/embedded-captions/modes/cinematic/engine.html +355 -0
- package/.agents/skills/embedded-captions/modes/standard/_anatomy.md +233 -0
- package/.agents/skills/embedded-captions/modes/standard/_motion.md +192 -0
- package/.agents/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs +97 -0
- package/.agents/skills/embedded-captions/references/aesthetic-principles.md +168 -0
- package/.agents/skills/embedded-captions/references/anti-patterns.md +188 -0
- package/.agents/skills/embedded-captions/references/bespoke-vs-presets.md +178 -0
- package/.agents/skills/embedded-captions/references/caption-grouping.md +130 -0
- package/.agents/skills/embedded-captions/references/composition-craft.md +522 -0
- package/.agents/skills/embedded-captions/references/direction-catalog.md +138 -0
- package/.agents/skills/embedded-captions/references/example-renders/champion.html +371 -0
- package/.agents/skills/embedded-captions/references/example-renders/memory-wall.html +334 -0
- package/.agents/skills/embedded-captions/references/failure-modes.md +145 -0
- package/.agents/skills/embedded-captions/references/layout-heuristics.md +238 -0
- package/.agents/skills/embedded-captions/references/motion-vocabulary.md +148 -0
- package/.agents/skills/embedded-captions/references/rail.md +68 -0
- package/.agents/skills/embedded-captions/references/reference-bar.md +47 -0
- package/.agents/skills/embedded-captions/references/scene-types.md +94 -0
- package/.agents/skills/embedded-captions/references/test-set.md +66 -0
- package/.agents/skills/embedded-captions/references/typographic-moves.md +266 -0
- package/.agents/skills/embedded-captions/references/typography-presets.md +63 -0
- package/.agents/skills/embedded-captions/scripts/audio-envelope.cjs +95 -0
- package/.agents/skills/embedded-captions/scripts/check-occlusion.cjs +250 -0
- package/.agents/skills/embedded-captions/scripts/check-overflow.cjs +194 -0
- package/.agents/skills/embedded-captions/scripts/check-rail-climax.cjs +233 -0
- package/.agents/skills/embedded-captions/scripts/check-timing.cjs +173 -0
- package/.agents/skills/embedded-captions/scripts/fill-timings.cjs +124 -0
- package/.agents/skills/embedded-captions/scripts/fit-fonts.cjs +158 -0
- package/.agents/skills/embedded-captions/scripts/gen-stroke-path.py +46 -0
- package/.agents/skills/embedded-captions/scripts/inject-fonts.cjs +169 -0
- package/.agents/skills/embedded-captions/scripts/lib-dna.cjs +201 -0
- package/.agents/skills/embedded-captions/scripts/make-cinematic.cjs +1205 -0
- package/.agents/skills/embedded-captions/scripts/make-composition.cjs +404 -0
- package/.agents/skills/embedded-captions/scripts/make-theme.cjs +8781 -0
- package/.agents/skills/embedded-captions/scripts/matte.cjs +294 -0
- package/.agents/skills/embedded-captions/scripts/measure-layout.cjs +293 -0
- package/.agents/skills/embedded-captions/scripts/prepare.sh +39 -0
- package/.agents/skills/embedded-captions/scripts/preview-frames.cjs +268 -0
- package/.agents/skills/embedded-captions/scripts/render-and-composite.sh +509 -0
- package/.agents/skills/embedded-captions/scripts/render-theme.sh +34 -0
- package/.agents/skills/embedded-captions/scripts/safe-zones.cjs +813 -0
- package/.agents/skills/embedded-captions/scripts/transcribe.cjs +349 -0
- package/.agents/skills/embedded-captions/themes/PORTING.md +49 -0
- package/.agents/skills/embedded-captions/themes/README.md +244 -0
- package/.agents/skills/embedded-captions/themes/anchor.json +27 -0
- package/.agents/skills/embedded-captions/themes/arcade.json +51 -0
- package/.agents/skills/embedded-captions/themes/aurora.json +41 -0
- package/.agents/skills/embedded-captions/themes/biolume.json +35 -0
- package/.agents/skills/embedded-captions/themes/brush.json +74 -0
- package/.agents/skills/embedded-captions/themes/chalkboard.json +52 -0
- package/.agents/skills/embedded-captions/themes/dossier.json +56 -0
- package/.agents/skills/embedded-captions/themes/graffiti.json +62 -0
- package/.agents/skills/embedded-captions/themes/hologram.json +41 -0
- package/.agents/skills/embedded-captions/themes/inkwater.json +43 -0
- package/.agents/skills/embedded-captions/themes/laser.json +46 -0
- package/.agents/skills/embedded-captions/themes/lastpage.json +33 -0
- package/.agents/skills/embedded-captions/themes/neonsign.json +53 -0
- package/.agents/skills/embedded-captions/themes/nightcity.json +56 -0
- package/.agents/skills/embedded-captions/themes/ordnance.json +54 -0
- package/.agents/skills/embedded-captions/themes/papercut.json +37 -0
- package/.agents/skills/embedded-captions/themes/popup.json +46 -0
- package/.agents/skills/embedded-captions/themes/ransom.json +62 -0
- package/.agents/skills/embedded-captions/themes/scoreboard.json +54 -0
- package/.agents/skills/embedded-captions/themes/spectrum.json +46 -0
- package/.agents/skills/embedded-captions/themes/stardust.json +29 -0
- package/.agents/skills/embedded-captions/themes/stomp.json +43 -0
- package/.agents/skills/embedded-captions/themes/terminal.json +49 -0
- package/.agents/skills/embedded-captions/themes/thunder.json +44 -0
- package/.agents/skills/embedded-captions/themes/transit.json +44 -0
- package/.agents/skills/embedded-captions/themes/vhs.json +47 -0
- package/.agents/skills/faceless-explainer/SKILL.md +209 -0
- package/.agents/skills/faceless-explainer/references/cut-catalog.md +215 -0
- package/.agents/skills/faceless-explainer/references/motion-language.md +156 -0
- package/.agents/skills/faceless-explainer/references/story-design.md +248 -0
- package/.agents/skills/faceless-explainer/references/visual-design.md +146 -0
- package/.agents/skills/faceless-explainer/scripts/assemble-index.mjs +570 -0
- package/.agents/skills/faceless-explainer/scripts/audio.mjs +260 -0
- package/.agents/skills/faceless-explainer/scripts/build-frame.mjs +536 -0
- package/.agents/skills/faceless-explainer/scripts/captions.mjs +508 -0
- package/.agents/skills/faceless-explainer/scripts/lib/assets.mjs +55 -0
- package/.agents/skills/faceless-explainer/scripts/lib/dimensions.mjs +45 -0
- package/.agents/skills/faceless-explainer/scripts/lib/storyboard.mjs +249 -0
- package/.agents/skills/faceless-explainer/scripts/lib/tokens.mjs +204 -0
- package/.agents/skills/faceless-explainer/scripts/lib/transition-registry.mjs +38 -0
- package/.agents/skills/faceless-explainer/scripts/lib/transitions.json +71 -0
- package/.agents/skills/faceless-explainer/scripts/transitions.mjs +320 -0
- package/.agents/skills/faceless-explainer/sub-agents/frame-worker.md +75 -0
- package/.agents/skills/flockposter/LICENSE +17 -0
- package/.agents/skills/flockposter/README.md +72 -0
- package/.agents/skills/flockposter/SKILL.md +562 -0
- package/.agents/skills/flockposter/examples/cli-instagram-reel.sh +21 -0
- package/.agents/skills/flockposter/examples/cli-multi-platform.json +69 -0
- package/.agents/skills/flockposter/examples/cli-tiktok-upload-only.sh +22 -0
- package/.agents/skills/flockposter/examples/cli-x-thread.sh +17 -0
- package/.agents/skills/flockposter/examples/cli-youtube-short.sh +21 -0
- package/.agents/skills/flockposter/examples/public-api-instagram-reel.json +28 -0
- package/.agents/skills/general-video/SKILL.md +143 -0
- package/.agents/skills/hyperframes/SKILL.md +160 -0
- package/.agents/skills/hyperframes-animation/SKILL.md +84 -0
- package/.agents/skills/hyperframes-animation/adapters/animate-text.md +64 -0
- package/.agents/skills/hyperframes-animation/adapters/animejs.md +114 -0
- package/.agents/skills/hyperframes-animation/adapters/css-animations.md +143 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-easing-and-stagger.md +118 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-timeline-and-labels.md +96 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-transforms-and-perf.md +96 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap.md +105 -0
- package/.agents/skills/hyperframes-animation/adapters/html-in-canvas-patterns.md +507 -0
- package/.agents/skills/hyperframes-animation/adapters/lottie.md +117 -0
- package/.agents/skills/hyperframes-animation/adapters/three.md +131 -0
- package/.agents/skills/hyperframes-animation/adapters/typegpu.md +178 -0
- package/.agents/skills/hyperframes-animation/adapters/waapi.md +101 -0
- package/.agents/skills/hyperframes-animation/blueprints/comparison-split.md +27 -0
- package/.agents/skills/hyperframes-animation/blueprints/constellation-hub.md +44 -0
- package/.agents/skills/hyperframes-animation/blueprints/cta-morph-press.md +28 -0
- package/.agents/skills/hyperframes-animation/blueprints/cursor-ui-demo.md +57 -0
- package/.agents/skills/hyperframes-animation/blueprints/dataviz-countup.md +46 -0
- package/.agents/skills/hyperframes-animation/blueprints/device-surface-showcase.md +53 -0
- package/.agents/skills/hyperframes-animation/blueprints/grid-card-assemble.md +66 -0
- package/.agents/skills/hyperframes-animation/blueprints/kinetic-type-beats.md +78 -0
- package/.agents/skills/hyperframes-animation/blueprints/logo-assemble-lockup.md +69 -0
- package/.agents/skills/hyperframes-animation/blueprints/overwhelm-surround.md +28 -0
- package/.agents/skills/hyperframes-animation/blueprints/spatial-pan-stations.md +37 -0
- package/.agents/skills/hyperframes-animation/blueprints/ticker-takeover.md +29 -0
- package/.agents/skills/hyperframes-animation/blueprints/titlecard-reveal.md +42 -0
- package/.agents/skills/hyperframes-animation/blueprints/typewriter-reveal.md +51 -0
- package/.agents/skills/hyperframes-animation/blueprints/video-text-pivot.md +30 -0
- package/.agents/skills/hyperframes-animation/blueprints-index.md +146 -0
- package/.agents/skills/hyperframes-animation/examples/assets/avatars/02.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/github.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/nvidia.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/visa.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/zoominfo.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/brand-reveal-assemble-zoom.html +382 -0
- package/.agents/skills/hyperframes-animation/examples/comparison-split-cards.html +649 -0
- package/.agents/skills/hyperframes-animation/examples/concept-demo-decode-pan.html +520 -0
- package/.agents/skills/hyperframes-animation/examples/cta-morph-press.html +468 -0
- package/.agents/skills/hyperframes-animation/examples/cta-orbit-collapse.html +1298 -0
- package/.agents/skills/hyperframes-animation/examples/demo-page-scroll-spotlight.html +759 -0
- package/.agents/skills/hyperframes-animation/examples/hook-counter-burst.html +729 -0
- package/.agents/skills/hyperframes-animation/examples/messaging-multi-phrase.html +352 -0
- package/.agents/skills/hyperframes-animation/examples/metric-video-text-pivot.html +779 -0
- package/.agents/skills/hyperframes-animation/examples/problem-mockup-overwhelm.html +1374 -0
- package/.agents/skills/hyperframes-animation/examples/proof-logo-chain.html +861 -0
- package/.agents/skills/hyperframes-animation/examples/takeover-ticker-displace.html +347 -0
- package/.agents/skills/hyperframes-animation/examples/workflow-approve-press.html +606 -0
- package/.agents/skills/hyperframes-animation/rules/3d-page-scroll.md +227 -0
- package/.agents/skills/hyperframes-animation/rules/3d-text-depth-layers.md +297 -0
- package/.agents/skills/hyperframes-animation/rules/ai-tracking-box.md +382 -0
- package/.agents/skills/hyperframes-animation/rules/ambient-glow-bloom.md +305 -0
- package/.agents/skills/hyperframes-animation/rules/asr-keyword-glow.md +286 -0
- package/.agents/skills/hyperframes-animation/rules/avatar-cloud-network.md +371 -0
- package/.agents/skills/hyperframes-animation/rules/camera-cursor-tracking.md +246 -0
- package/.agents/skills/hyperframes-animation/rules/card-morph-anchor.md +267 -0
- package/.agents/skills/hyperframes-animation/rules/center-outward-expansion.md +227 -0
- package/.agents/skills/hyperframes-animation/rules/context-sensitive-cursor.md +257 -0
- package/.agents/skills/hyperframes-animation/rules/coordinate-target-zoom.md +332 -0
- package/.agents/skills/hyperframes-animation/rules/counting-dynamic-scale.md +283 -0
- package/.agents/skills/hyperframes-animation/rules/css-marker-patterns.md +373 -0
- package/.agents/skills/hyperframes-animation/rules/cursor-click-ripple.md +262 -0
- package/.agents/skills/hyperframes-animation/rules/depth-of-field-blur.md +313 -0
- package/.agents/skills/hyperframes-animation/rules/depth-scatter-assemble.md +303 -0
- package/.agents/skills/hyperframes-animation/rules/discrete-text-sequence.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +307 -0
- package/.agents/skills/hyperframes-animation/rules/gsap-effects.md +299 -0
- package/.agents/skills/hyperframes-animation/rules/hacker-flip-3d.md +223 -0
- package/.agents/skills/hyperframes-animation/rules/kinetic-beat-slam.md +183 -0
- package/.agents/skills/hyperframes-animation/rules/motion-blur-streak.md +328 -0
- package/.agents/skills/hyperframes-animation/rules/multi-phase-camera.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/orbit-3d-entry.md +301 -0
- package/.agents/skills/hyperframes-animation/rules/physics-press-reaction.md +350 -0
- package/.agents/skills/hyperframes-animation/rules/press-release-spring.md +296 -0
- package/.agents/skills/hyperframes-animation/rules/reactive-displacement.md +277 -0
- package/.agents/skills/hyperframes-animation/rules/scale-swap-transition.md +298 -0
- package/.agents/skills/hyperframes-animation/rules/sine-wave-loop.md +278 -0
- package/.agents/skills/hyperframes-animation/rules/split-tilt-cards.md +277 -0
- package/.agents/skills/hyperframes-animation/rules/spring-pop-entrance.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/stat-bars-and-fills.md +156 -0
- package/.agents/skills/hyperframes-animation/rules/svg-icon-enrichment.md +329 -0
- package/.agents/skills/hyperframes-animation/rules/svg-path-draw.md +274 -0
- package/.agents/skills/hyperframes-animation/rules/vertical-spring-ticker.md +239 -0
- package/.agents/skills/hyperframes-animation/rules/viewport-change.md +349 -0
- package/.agents/skills/hyperframes-animation/rules-index.md +86 -0
- package/.agents/skills/hyperframes-animation/scripts/animation-map.mjs +606 -0
- package/.agents/skills/hyperframes-animation/scripts/package-loader.mjs +288 -0
- package/.agents/skills/hyperframes-animation/scripts/package-loader.test.mjs +62 -0
- package/.agents/skills/hyperframes-animation/techniques.md +507 -0
- package/.agents/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +167 -0
- package/.agents/skills/hyperframes-animation/transitions/catalog.md +127 -0
- package/.agents/skills/hyperframes-animation/transitions/css-3d.md +12 -0
- package/.agents/skills/hyperframes-animation/transitions/css-blur.md +51 -0
- package/.agents/skills/hyperframes-animation/transitions/css-cover.md +43 -0
- package/.agents/skills/hyperframes-animation/transitions/css-destruction.md +95 -0
- package/.agents/skills/hyperframes-animation/transitions/css-dissolve.md +66 -0
- package/.agents/skills/hyperframes-animation/transitions/css-distortion.md +45 -0
- package/.agents/skills/hyperframes-animation/transitions/css-grid.md +10 -0
- package/.agents/skills/hyperframes-animation/transitions/css-light.md +49 -0
- package/.agents/skills/hyperframes-animation/transitions/css-mechanical.md +30 -0
- package/.agents/skills/hyperframes-animation/transitions/css-other.md +25 -0
- package/.agents/skills/hyperframes-animation/transitions/css-push.md +41 -0
- package/.agents/skills/hyperframes-animation/transitions/css-radial.md +37 -0
- package/.agents/skills/hyperframes-animation/transitions/css-scale.md +24 -0
- package/.agents/skills/hyperframes-animation/transitions/overview.md +153 -0
- package/.agents/skills/hyperframes-cli/SKILL.md +113 -0
- package/.agents/skills/hyperframes-cli/references/doctor-browser.md +45 -0
- package/.agents/skills/hyperframes-cli/references/init-and-scaffold.md +55 -0
- package/.agents/skills/hyperframes-cli/references/lambda.md +132 -0
- package/.agents/skills/hyperframes-cli/references/lint-validate-inspect.md +121 -0
- package/.agents/skills/hyperframes-cli/references/preview-render.md +149 -0
- package/.agents/skills/hyperframes-cli/references/upgrade-info-misc.md +75 -0
- package/.agents/skills/hyperframes-core/SKILL.md +78 -0
- package/.agents/skills/hyperframes-core/references/composition-patterns.md +263 -0
- package/.agents/skills/hyperframes-core/references/data-attributes.md +70 -0
- package/.agents/skills/hyperframes-core/references/determinism-rules.md +68 -0
- package/.agents/skills/hyperframes-core/references/full-screen-motion.md +62 -0
- package/.agents/skills/hyperframes-core/references/minimal-composition.md +66 -0
- package/.agents/skills/hyperframes-core/references/script-format.md +49 -0
- package/.agents/skills/hyperframes-core/references/storyboard-format.md +95 -0
- package/.agents/skills/hyperframes-core/references/sub-compositions.md +237 -0
- package/.agents/skills/hyperframes-core/references/subagent-dispatch.md +41 -0
- package/.agents/skills/hyperframes-core/references/tailwind.md +125 -0
- package/.agents/skills/hyperframes-core/references/tracks-and-clips.md +76 -0
- package/.agents/skills/hyperframes-core/references/variables-and-media.md +90 -0
- package/.agents/skills/hyperframes-creative/SKILL.md +70 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md +289 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/caption-skin.html +221 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/frame-showcase.html +1214 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/FRAME.md +275 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/frame-showcase.html +1347 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/FRAME.md +307 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/caption-skin.html +223 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/frame-showcase.html +1372 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/FRAME.md +275 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/caption-skin.html +230 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/frame-showcase.html +1140 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/FRAME.md +284 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/caption-skin.html +225 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/frame-showcase.html +1166 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/FRAME.md +284 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/frame-showcase.html +1465 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/FRAME.md +278 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/caption-skin.html +222 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/frame-showcase.html +1263 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/FRAME.md +277 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/frame-showcase.html +1439 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md +265 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/caption-skin.html +238 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/frame-showcase.html +1468 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/FRAME.md +314 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/caption-skin.html +226 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/frame-showcase.html +1268 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/FRAME.md +333 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/caption-skin.html +227 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/frame-showcase.html +1330 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/FRAME.md +274 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/caption-skin.html +230 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/frame-showcase.html +1444 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/FRAME.md +265 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/caption-skin.html +223 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/frame-showcase.html +1273 -0
- package/.agents/skills/hyperframes-creative/palettes/bold-energetic.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/clean-corporate.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/dark-premium.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/jewel-rich.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/monochrome.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/nature-earth.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/neon-electric.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/pastel-soft.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/warm-editorial.md +14 -0
- package/.agents/skills/hyperframes-creative/references/audio-reactive.md +76 -0
- package/.agents/skills/hyperframes-creative/references/beat-direction.md +164 -0
- package/.agents/skills/hyperframes-creative/references/composition-patterns.md +199 -0
- package/.agents/skills/hyperframes-creative/references/data-in-motion.md +19 -0
- package/.agents/skills/hyperframes-creative/references/design-adherence.md +19 -0
- package/.agents/skills/hyperframes-creative/references/design-picker.md +123 -0
- package/.agents/skills/hyperframes-creative/references/design-spec.md +55 -0
- package/.agents/skills/hyperframes-creative/references/house-style.md +73 -0
- package/.agents/skills/hyperframes-creative/references/motion-principles.md +150 -0
- package/.agents/skills/hyperframes-creative/references/narration.md +92 -0
- package/.agents/skills/hyperframes-creative/references/prompt-expansion.md +68 -0
- package/.agents/skills/hyperframes-creative/references/typography.md +218 -0
- package/.agents/skills/hyperframes-creative/references/video-composition.md +63 -0
- package/.agents/skills/hyperframes-creative/references/visual-styles.md +457 -0
- package/.agents/skills/hyperframes-creative/scripts/contrast-report.mjs +353 -0
- package/.agents/skills/hyperframes-creative/scripts/extract-audio-data.py +188 -0
- package/.agents/skills/hyperframes-creative/scripts/package-loader.mjs +288 -0
- package/.agents/skills/hyperframes-creative/scripts/package-loader.test.mjs +62 -0
- package/.agents/skills/hyperframes-creative/templates/design-picker.html +1432 -0
- package/.agents/skills/hyperframes-keyframes/SKILL.md +237 -0
- package/.agents/skills/hyperframes-keyframes/agents/openai.yaml +4 -0
- package/.agents/skills/hyperframes-keyframes/references/keyframe-patterns.md +106 -0
- package/.agents/skills/motion-graphics/SKILL.md +172 -0
- package/.agents/skills/motion-graphics/agents/builder.md +40 -0
- package/.agents/skills/motion-graphics/agents/director.md +53 -0
- package/.agents/skills/motion-graphics/agents/finalize.md +17 -0
- package/.agents/skills/motion-graphics/catalog-map.md +40 -0
- package/.agents/skills/motion-graphics/categories/asset-fusion/module.md +37 -0
- package/.agents/skills/motion-graphics/categories/charts/module.md +21 -0
- package/.agents/skills/motion-graphics/categories/kinetic-type/module.md +19 -0
- package/.agents/skills/motion-graphics/categories/logo-reveal/module.md +17 -0
- package/.agents/skills/motion-graphics/categories/lower-thirds/module.md +16 -0
- package/.agents/skills/motion-graphics/categories/maps/bake-basemap.mjs +273 -0
- package/.agents/skills/motion-graphics/categories/maps/module.md +61 -0
- package/.agents/skills/motion-graphics/categories/news/module.md +56 -0
- package/.agents/skills/motion-graphics/categories/stat/module.md +21 -0
- package/.agents/skills/motion-graphics/categories/tweet/module.md +16 -0
- package/.agents/skills/motion-graphics/categories/webpage/module.md +21 -0
- package/.agents/skills/motion-graphics/grounding/PROTOCOL.md +64 -0
- package/.agents/skills/motion-graphics/grounding/locate.mjs +227 -0
- package/.agents/skills/motion-graphics/phases/source/guide.md +21 -0
- package/.agents/skills/motion-graphics/references/builder-contract.md +38 -0
- package/.agents/skills/motion-graphics/references/motion-vocabulary.md +43 -0
- package/.agents/skills/motion-graphics/references/shot-plan-ir.md +54 -0
- package/.agents/skills/motion-graphics/samples/asset-fusion/_ref-circle-highlight.html +306 -0
- package/.agents/skills/product-launch-video/SKILL.md +208 -0
- package/.agents/skills/product-launch-video/references/cut-catalog.md +220 -0
- package/.agents/skills/product-launch-video/references/motion-language.md +156 -0
- package/.agents/skills/product-launch-video/references/story-design.md +373 -0
- package/.agents/skills/product-launch-video/references/visual-design.md +126 -0
- package/.agents/skills/product-launch-video/scripts/assemble-index.mjs +570 -0
- package/.agents/skills/product-launch-video/scripts/audio.mjs +260 -0
- package/.agents/skills/product-launch-video/scripts/build-frame.mjs +536 -0
- package/.agents/skills/product-launch-video/scripts/captions.mjs +508 -0
- package/.agents/skills/product-launch-video/scripts/lib/assets.mjs +55 -0
- package/.agents/skills/product-launch-video/scripts/lib/dimensions.mjs +45 -0
- package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.mjs +36 -0
- package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.test.mjs +76 -0
- package/.agents/skills/product-launch-video/scripts/lib/storyboard.mjs +249 -0
- package/.agents/skills/product-launch-video/scripts/lib/tokens.mjs +204 -0
- package/.agents/skills/product-launch-video/scripts/lib/transition-registry.mjs +38 -0
- package/.agents/skills/product-launch-video/scripts/lib/transitions.json +71 -0
- package/.agents/skills/product-launch-video/scripts/stage-assets.mjs +39 -0
- package/.agents/skills/product-launch-video/scripts/transitions.mjs +327 -0
- package/.agents/skills/product-launch-video/sub-agents/frame-worker.md +75 -0
- package/.agents/skills/slideshow/SKILL.md +550 -0
- package/.agents/skills/slideshow/references/standalone-harness.md +1020 -0
- package/.agents/skills/talking-head-recut/NOTICE.md +39 -0
- package/.agents/skills/talking-head-recut/SKILL.md +1195 -0
- package/.agents/skills/talking-head-recut/assets/vendor/gsap.min.js +10 -0
- package/.agents/skills/talking-head-recut/references/DESIGN_INDEX.md +145 -0
- package/.agents/skills/talking-head-recut/references/frames/clean.html +92 -0
- package/.agents/skills/talking-head-recut/references/frames/hairline.html +171 -0
- package/.agents/skills/talking-head-recut/references/frames/polaroid.html +131 -0
- package/.agents/skills/talking-head-recut/references/layouts/overlay.html +164 -0
- package/.agents/skills/talking-head-recut/references/layouts/pip.html +143 -0
- package/.agents/skills/talking-head-recut/references/layouts/split.html +121 -0
- package/.agents/skills/talking-head-recut/references/layouts/stack.html +109 -0
- package/.agents/skills/talking-head-recut/references/styles/academic.html +172 -0
- package/.agents/skills/talking-head-recut/references/styles/audit.html +170 -0
- package/.agents/skills/talking-head-recut/references/styles/editorial.html +189 -0
- package/.agents/skills/talking-head-recut/references/styles/geom.html +181 -0
- package/.agents/skills/talking-head-recut/references/styles/minimal.html +130 -0
- package/.agents/skills/talking-head-recut/references/styles/spotlight.html +142 -0
- package/.agents/skills/talking-head-recut/references/styles/swiss.html +188 -0
- package/.agents/skills/talking-head-recut/references/styles/terminal.html +196 -0
- package/.agents/skills/talking-head-recut/references/styles/whiteboard.html +170 -0
- package/.agents/skills/talking-head-recut/references/styles/xhs.html +206 -0
- package/.agents/skills/vidfarm-media/SKILL.md +85 -0
- package/.agents/skills/vidfarm-media/references/tts.md +54 -0
- package/.agents/skills/vidfarm-media/scripts/audio.mjs +628 -0
- package/.agents/skills/vidfarm-media/scripts/wait-bgm.mjs +31 -0
- package/.agents/skills/website-to-video/SKILL.md +145 -0
- package/.agents/skills/website-to-video/assets/sfx/CREDITS.md +35 -0
- package/.agents/skills/website-to-video/assets/sfx/manifest.json +97 -0
- package/.agents/skills/website-to-video/references/beat-builder-guide.md +263 -0
- package/.agents/skills/website-to-video/references/capabilities.md +713 -0
- package/.agents/skills/website-to-video/references/step-0-capture.md +55 -0
- package/.agents/skills/website-to-video/references/step-1-design.md +333 -0
- package/.agents/skills/website-to-video/references/step-2-brief.md +178 -0
- package/.agents/skills/website-to-video/references/step-3-storyboard.md +572 -0
- package/.agents/skills/website-to-video/references/step-4-vo.md +225 -0
- package/.agents/skills/website-to-video/references/step-5-build.md +483 -0
- package/.agents/skills/website-to-video/references/step-6-validate.md +341 -0
- package/.agents/skills/website-to-video/scripts/w2h-verify.mjs +759 -0
- package/SKILL.director.md +37 -0
- package/SKILL.platform.md +6 -1
- package/demo/dist/app.js +295 -11
- package/dist/src/app.js +317 -133
- package/dist/src/cli.js +529 -12
- package/dist/src/composition-runtime.js +262 -3
- package/dist/src/devcli/doctor.js +192 -0
- package/dist/src/devcli/hyperframes-cli.js +118 -0
- package/dist/src/devcli/skills.js +476 -0
- package/dist/src/devcli/stills.js +249 -0
- package/dist/src/editor-chat.js +255 -0
- package/dist/src/hyperframes/composition.js +5 -5
- package/dist/src/services/composition-lint.js +199 -0
- package/dist/src/services/hyperframes.js +67 -13
- package/package.json +2 -1
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: center-outward-expansion
|
|
3
|
+
description: Elements start clustered at screen center and expand outward to their final positions, driven by a shared progress value.
|
|
4
|
+
metadata:
|
|
5
|
+
tags: expansion, scatter, center, reveal, layout, sync, burst
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Center-Outward Expansion
|
|
9
|
+
|
|
10
|
+
Elements begin at a shared center point and radiate outward to their final positions. The expansion can be the entry beat itself, or **driven by another animation's progress** (e.g. a counting number growing) for coordinated motion.
|
|
11
|
+
|
|
12
|
+
## How It Works
|
|
13
|
+
|
|
14
|
+
Each element has a `targetX/Y` (its final layout position) and a shared `centerX/Y`. A `progress` value (0→1) interpolates each element between center and target:
|
|
15
|
+
|
|
16
|
+
```js
|
|
17
|
+
const x = centerX + (targetX - centerX) * progress;
|
|
18
|
+
const y = centerY + (targetY - centerY) * progress;
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
When `progress = 0` all elements overlap at the center; when `progress = 1` they're at their final spots.
|
|
22
|
+
|
|
23
|
+
## HTML
|
|
24
|
+
|
|
25
|
+
```html
|
|
26
|
+
<div
|
|
27
|
+
class="scene"
|
|
28
|
+
data-composition-id="burst-scene"
|
|
29
|
+
data-start="0"
|
|
30
|
+
data-duration="3"
|
|
31
|
+
data-track-index="0"
|
|
32
|
+
>
|
|
33
|
+
<div class="burst-wrap">
|
|
34
|
+
<div class="burst-item" data-target-x="-360" data-target-y="-180">{itemA}</div>
|
|
35
|
+
<div class="burst-item" data-target-x="360" data-target-y="-180">{itemB}</div>
|
|
36
|
+
<div class="burst-item" data-target-x="-360" data-target-y="180">{itemC}</div>
|
|
37
|
+
<div class="burst-item" data-target-x="360" data-target-y="180">{itemD}</div>
|
|
38
|
+
<div class="burst-item" data-target-x="0" data-target-y="-360">{itemE}</div>
|
|
39
|
+
<div class="burst-item" data-target-x="0" data-target-y="360">{itemF}</div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## CSS
|
|
45
|
+
|
|
46
|
+
```css
|
|
47
|
+
.scene {
|
|
48
|
+
position: relative;
|
|
49
|
+
width: 100%;
|
|
50
|
+
height: 100%;
|
|
51
|
+
display: grid;
|
|
52
|
+
place-items: center;
|
|
53
|
+
background: {bgColor};
|
|
54
|
+
}
|
|
55
|
+
.burst-wrap {
|
|
56
|
+
position: relative;
|
|
57
|
+
width: 100%;
|
|
58
|
+
height: 100%;
|
|
59
|
+
display: grid;
|
|
60
|
+
place-items: center;
|
|
61
|
+
}
|
|
62
|
+
.burst-item {
|
|
63
|
+
position: absolute;
|
|
64
|
+
/* Items start at the wrap center via the absolute + 50% trick.
|
|
65
|
+
We tween translate offsets via GSAP, not left/top. */
|
|
66
|
+
top: 50%;
|
|
67
|
+
left: 50%;
|
|
68
|
+
transform: translate(-50%, -50%);
|
|
69
|
+
|
|
70
|
+
width: {itemSize};
|
|
71
|
+
height: {itemSize};
|
|
72
|
+
display: grid;
|
|
73
|
+
place-items: center;
|
|
74
|
+
background: {itemBgColor};
|
|
75
|
+
border-radius: 28px;
|
|
76
|
+
font-family: {font};
|
|
77
|
+
font-weight: 900;
|
|
78
|
+
font-size: 96px;
|
|
79
|
+
color: {textColor};
|
|
80
|
+
will-change: transform;
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## GSAP Timeline
|
|
85
|
+
|
|
86
|
+
```html
|
|
87
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
|
88
|
+
<script>
|
|
89
|
+
window.__timelines = window.__timelines || {};
|
|
90
|
+
const tl = gsap.timeline({ paused: true });
|
|
91
|
+
|
|
92
|
+
const items = document.querySelectorAll(".burst-item");
|
|
93
|
+
|
|
94
|
+
// Each element gets its own from→to that lerps center (translate(-50%, -50%))
|
|
95
|
+
// → target offset. xPercent/yPercent bakes the self-centering; x/y animates
|
|
96
|
+
// toward the target.
|
|
97
|
+
items.forEach((el, i) => {
|
|
98
|
+
const targetX = Number(el.dataset.targetX);
|
|
99
|
+
const targetY = Number(el.dataset.targetY);
|
|
100
|
+
tl.fromTo(
|
|
101
|
+
el,
|
|
102
|
+
{ xPercent: -50, yPercent: -50, x: 0, y: 0, scale: 0.6, opacity: 0 },
|
|
103
|
+
{
|
|
104
|
+
x: targetX,
|
|
105
|
+
y: targetY,
|
|
106
|
+
scale: 1,
|
|
107
|
+
opacity: 1,
|
|
108
|
+
duration: EXPAND_DUR,
|
|
109
|
+
ease: EXPAND_EASE,
|
|
110
|
+
},
|
|
111
|
+
i * STAGGER + ENTRY_AT, // stagger; ENTRY_AT offsets the burst beat
|
|
112
|
+
);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
window.__timelines["burst-scene"] = tl;
|
|
116
|
+
</script>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## How to Choose Values
|
|
120
|
+
|
|
121
|
+
- **ITEM_COUNT** — number of elements in the burst
|
|
122
|
+
- Range: 3–8
|
|
123
|
+
- Effects: 3 = sparse; 8 = busy. > 8 causes visual chaos where cards overlap mid-expansion
|
|
124
|
+
- Constraints: at low counts, prefer wider angular spread (target positions further apart)
|
|
125
|
+
|
|
126
|
+
- **EXPAND_DUR** — duration of each item's center → target tween
|
|
127
|
+
- Range: 1.0–1.8 s
|
|
128
|
+
- Effects: shorter = snappy burst; longer = floats outward
|
|
129
|
+
- Constraints: if driven by a counter, must equal the counter's duration (chord)
|
|
130
|
+
|
|
131
|
+
- **EXPAND_EASE** — shared ease across all items
|
|
132
|
+
- Discrete choice: `power2.out`, `power3.out`, `expo.out`
|
|
133
|
+
- Selection: `power3.out` is the default — fling out then settle. `power2.out` is gentler. `expo.out` makes them stop dramatically. Avoid `in` easings (they read as items being sucked back in mid-air).
|
|
134
|
+
- Constraint: if driven by another animation, must be identical to the driver's ease
|
|
135
|
+
|
|
136
|
+
- **STAGGER** — gap between successive items' start times
|
|
137
|
+
- Range: 0.04–0.08 s
|
|
138
|
+
- Effects: < 0.04 = simultaneous chord; > 0.08 feels lazy / arpeggiated
|
|
139
|
+
- Constraints: ITEM_COUNT × STAGGER must be < EXPAND_DUR or the last items still moving when others have landed reads as ragged
|
|
140
|
+
|
|
141
|
+
- **ENTRY_AT** — offset applied to the whole burst start
|
|
142
|
+
- Range: 0 – 0.5 s
|
|
143
|
+
- Effects: > 0 gives a beat of compositional quiet before the burst
|
|
144
|
+
|
|
145
|
+
- **START_PROGRESS** — fraction of the center→target path where items begin (for partially-spread variant)
|
|
146
|
+
- Range: 0 (exact center) – 0.5
|
|
147
|
+
- Effects: 0 = full cluster, dramatic spread; 0.3 = avoids initial pile-up at center
|
|
148
|
+
|
|
149
|
+
## Variations
|
|
150
|
+
|
|
151
|
+
### Synced expansion (driven by a counter)
|
|
152
|
+
|
|
153
|
+
If the burst should mirror a counting animation's progress:
|
|
154
|
+
|
|
155
|
+
```js
|
|
156
|
+
// Counter tween defines a state.value 0 → TARGET over COUNT_DUR
|
|
157
|
+
const counterState = { value: 0 };
|
|
158
|
+
const burstState = { p: 0 };
|
|
159
|
+
|
|
160
|
+
// Shared tween — same duration, same ease — visually a "chord"
|
|
161
|
+
tl.to(
|
|
162
|
+
counterState,
|
|
163
|
+
{
|
|
164
|
+
value: COUNT_TARGET,
|
|
165
|
+
duration: COUNT_DUR,
|
|
166
|
+
ease: COUNT_EASE,
|
|
167
|
+
onUpdate: () => (counterEl.textContent = Math.round(counterState.value).toLocaleString()),
|
|
168
|
+
},
|
|
169
|
+
0,
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
tl.to(
|
|
173
|
+
burstState,
|
|
174
|
+
{
|
|
175
|
+
p: 1,
|
|
176
|
+
duration: COUNT_DUR,
|
|
177
|
+
ease: COUNT_EASE,
|
|
178
|
+
onUpdate: () =>
|
|
179
|
+
items.forEach((el) => {
|
|
180
|
+
const tx = Number(el.dataset.targetX) * burstState.p;
|
|
181
|
+
const ty = Number(el.dataset.targetY) * burstState.p;
|
|
182
|
+
el.style.transform = `translate(-50%, -50%) translate(${tx}px, ${ty}px)`;
|
|
183
|
+
}),
|
|
184
|
+
},
|
|
185
|
+
0,
|
|
186
|
+
);
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Starting partially-spread
|
|
190
|
+
|
|
191
|
+
To avoid the initial clustered mess (6+ elements stacked at center), start at `START_PROGRESS`:
|
|
192
|
+
|
|
193
|
+
```js
|
|
194
|
+
{ x: targetX * START_PROGRESS, y: targetY * START_PROGRESS, scale: 0.4, opacity: 0 }
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Idle micro-float at final position
|
|
198
|
+
|
|
199
|
+
Pair with `sine-wave-loop` after expansion lands — keeps elements alive instead of frozen.
|
|
200
|
+
|
|
201
|
+
## Key Principles
|
|
202
|
+
|
|
203
|
+
- **Driver vs driven** — if the burst stands on its own, use a per-item stagger; if it shadows another animation (counter, audio beat), share the same eased progress so they read as one beat
|
|
204
|
+
- **Stagger inside the 0.04-0.08 s band** — too tight and the cluster never separates visually, too loose and the burst feels lazy
|
|
205
|
+
- **Out-easing for the expansion** — out-easing makes items "fling" out then settle. In-easing looks like they're sucked back in mid-air
|
|
206
|
+
- **Element count: 3-8** — fewer feels empty, more causes visual chaos at the center where cards overlap mid-expansion
|
|
207
|
+
- **❗ Don't put a label below the burst as the "real headline"** — if you do, the eye snaps to the label and ignores the burst. The burst IS the beat. If a label is needed, use big block-caps and reveal it post-burst, in the same stacked layout.
|
|
208
|
+
|
|
209
|
+
## Critical Constraints
|
|
210
|
+
|
|
211
|
+
- **Timeline must be paused**: `gsap.timeline({ paused: true })`
|
|
212
|
+
- **Registry key = `data-composition-id`**
|
|
213
|
+
- **Use translate, not left/top** — translating composes cleanly with the centering `translate(-50%, -50%)` trick; mutating `left`/`top` fights the centering and causes pixel jitter
|
|
214
|
+
- **`will-change: transform`** on burst items — many simultaneous transforms benefit from compositor hints
|
|
215
|
+
- **No `position: absolute` parents inside `burst-wrap` other than items themselves** — sibling absolute elements would steal the centered baseline
|
|
216
|
+
|
|
217
|
+
## Combinations
|
|
218
|
+
|
|
219
|
+
- [counting-dynamic-scale.md](counting-dynamic-scale.md) — counter peak drives the burst peak (chord)
|
|
220
|
+
- [sine-wave-loop.md](sine-wave-loop.md) — idle motion after the burst lands
|
|
221
|
+
- [card-morph-anchor.md](card-morph-anchor.md) — burst out of a morphed card
|
|
222
|
+
|
|
223
|
+
## Pairs with HF skills
|
|
224
|
+
|
|
225
|
+
- `/hyperframes-animation` — timeline + stagger
|
|
226
|
+
- `/hyperframes-core` — composition wiring
|
|
227
|
+
- `/hyperframes-cli` — `hyperframes lint`
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: context-sensitive-cursor
|
|
3
|
+
description: Cursor color and styling that adapt to the current text segment being typed — accent color on highlights, dim on placeholders, etc.
|
|
4
|
+
metadata:
|
|
5
|
+
tags: cursor, color, context, typewriter, styling, segment
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Context-Sensitive Cursor
|
|
9
|
+
|
|
10
|
+
In a typewriter sequence, the cursor's color (and optionally height/blink rate) matches the **active text segment**. If the typewriter is currently typing a brand name, the cursor is the brand accent color; on a placeholder, it dims to gray. Enhances visual cohesion vs a single fixed cursor color across all text states.
|
|
11
|
+
|
|
12
|
+
## How It Works
|
|
13
|
+
|
|
14
|
+
The text is authored as a SEQUENCE of `{text, t, segment}` entries where `segment` is a string identifier ('main' / 'highlight' / 'brand' / 'success'). The driver tween's onUpdate determines the current segment based on `time`, then sets the cursor's CSS color (and optionally other props) to match that segment's palette.
|
|
15
|
+
|
|
16
|
+
## HTML
|
|
17
|
+
|
|
18
|
+
```html
|
|
19
|
+
<div
|
|
20
|
+
class="scene"
|
|
21
|
+
id="cursor-scene"
|
|
22
|
+
data-composition-id="cursor-scene"
|
|
23
|
+
data-start="0"
|
|
24
|
+
data-duration="{DURATION}"
|
|
25
|
+
data-track-index="0"
|
|
26
|
+
>
|
|
27
|
+
<div class="terminal">
|
|
28
|
+
<div class="prompt">$</div>
|
|
29
|
+
<div class="text-wrap">
|
|
30
|
+
<span class="text" id="text"></span><span class="cursor" id="cursor">_</span>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## CSS
|
|
37
|
+
|
|
38
|
+
Placeholders: `{monoFont}` is the project's monospace stack (proportional fonts cause cursor drift mid-segment); `{bgColor}` is the dark backdrop; `{textColor}` is the readable foreground; `{promptColor}` is the segment-default color for the leading prompt glyph.
|
|
39
|
+
|
|
40
|
+
```css
|
|
41
|
+
.scene {
|
|
42
|
+
position: relative;
|
|
43
|
+
width: 100%;
|
|
44
|
+
height: 100%;
|
|
45
|
+
display: grid;
|
|
46
|
+
place-items: center;
|
|
47
|
+
background: {bgColor};
|
|
48
|
+
font-family: {monoFont};
|
|
49
|
+
}
|
|
50
|
+
.terminal {
|
|
51
|
+
display: flex;
|
|
52
|
+
align-items: baseline;
|
|
53
|
+
gap: 24px;
|
|
54
|
+
font-size: 72px;
|
|
55
|
+
font-weight: 800;
|
|
56
|
+
color: {textColor};
|
|
57
|
+
white-space: pre;
|
|
58
|
+
}
|
|
59
|
+
.prompt {
|
|
60
|
+
color: {promptColor};
|
|
61
|
+
}
|
|
62
|
+
.text-wrap {
|
|
63
|
+
display: inline-flex;
|
|
64
|
+
align-items: baseline;
|
|
65
|
+
min-width: 1200px;
|
|
66
|
+
}
|
|
67
|
+
.text {
|
|
68
|
+
color: {textColor};
|
|
69
|
+
white-space: pre;
|
|
70
|
+
}
|
|
71
|
+
/* Cursor highlights based on active segment via per-frame background swap */
|
|
72
|
+
.cursor {
|
|
73
|
+
display: inline-block;
|
|
74
|
+
width: {cursorWidth}px;
|
|
75
|
+
height: {cursorHeight}px;
|
|
76
|
+
background: {textColor}; /* default — overridden per segment in onUpdate */
|
|
77
|
+
margin-left: {cursorGap}px;
|
|
78
|
+
vertical-align: {cursorBaselineFix}px;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## GSAP Timeline
|
|
83
|
+
|
|
84
|
+
```html
|
|
85
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
|
86
|
+
<script>
|
|
87
|
+
window.__timelines = window.__timelines || {};
|
|
88
|
+
const tl = gsap.timeline({ paused: true });
|
|
89
|
+
|
|
90
|
+
// Sequence with per-entry segment label.
|
|
91
|
+
// Each entry: { t: absoluteSeconds, text: cumulative visible string, segment: paletteKey, color: hex }.
|
|
92
|
+
// As the driver crosses each `t`, the cursor color swaps to that segment's accent —
|
|
93
|
+
// viewer's eye locks onto the keyword being typed.
|
|
94
|
+
// Shape: a monotonic timeline of N entries where adjacent entries usually share text-prefix
|
|
95
|
+
// but may differ in `segment` (which is what makes the cursor color shift mid-line).
|
|
96
|
+
const SEQUENCE = [
|
|
97
|
+
{ t: 0, text: "", segment: "main", color: "{mainColor}" },
|
|
98
|
+
{ t: T_LEADIN_END, text: "{leadInChunk}", segment: "main", color: "{mainColor}" },
|
|
99
|
+
{ t: T_BRAND_IN, text: "{leadInBrandPrefix}", segment: "brand", color: "{brandColor}" }, // brand segment starts
|
|
100
|
+
{ t: T_BRAND_OUT, text: "{leadInBrandFull}", segment: "main", color: "{mainColor}" }, // back to main
|
|
101
|
+
{ t: T_CMD_IN, text: "{leadInCmdPrefix}", segment: "cmd", color: "{cmdColor}" }, // command segment
|
|
102
|
+
{ t: T_BRAND_2, text: "{leadInCmdBrand}", segment: "brand", color: "{brandColor}" }, // brand again (e.g. filename)
|
|
103
|
+
{ t: T_SUCCESS, text: "{leadInDone}", segment: "success", color: "{successColor}" }, // completion mark
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
function entryAt(time) {
|
|
107
|
+
for (let i = SEQUENCE.length - 1; i >= 0; i--) {
|
|
108
|
+
if (time >= SEQUENCE[i].t) return SEQUENCE[i];
|
|
109
|
+
}
|
|
110
|
+
return SEQUENCE[0];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const textEl = document.getElementById("text");
|
|
114
|
+
const cursorEl = document.getElementById("cursor");
|
|
115
|
+
|
|
116
|
+
// Discrete state driver — writes text + cursor color
|
|
117
|
+
const driver = { t: 0 };
|
|
118
|
+
tl.to(
|
|
119
|
+
driver,
|
|
120
|
+
{
|
|
121
|
+
t: DURATION,
|
|
122
|
+
duration: DURATION,
|
|
123
|
+
ease: "none",
|
|
124
|
+
onUpdate: () => {
|
|
125
|
+
const entry = entryAt(driver.t);
|
|
126
|
+
textEl.textContent = entry.text;
|
|
127
|
+
cursorEl.style.background = entry.color;
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
0,
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
// Deterministic blink via sin (NOT CSS animation).
|
|
134
|
+
// Phase sweep = (2π) × BLINK_CYCLES_PER_SCENE drives a square wave at sign(sin(p)).
|
|
135
|
+
const blink = { p: 0 };
|
|
136
|
+
tl.to(
|
|
137
|
+
blink,
|
|
138
|
+
{
|
|
139
|
+
p: Math.PI * 2 * BLINK_CYCLES_PER_SCENE,
|
|
140
|
+
duration: DURATION,
|
|
141
|
+
ease: "none",
|
|
142
|
+
onUpdate: () => {
|
|
143
|
+
cursorEl.style.opacity = Math.sin(blink.p) > 0 ? "1" : "0";
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
0,
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
window.__timelines["cursor-scene"] = tl;
|
|
150
|
+
</script>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Variations
|
|
154
|
+
|
|
155
|
+
### Non-blinking during active typing
|
|
156
|
+
|
|
157
|
+
When letters are being added (driver moved forward in the last `TYPING_GRACE` seconds), suppress blink — cursor stays solid. When no typing activity (`driver.t - lastChangeTime > TYPING_GRACE`), resume blink.
|
|
158
|
+
|
|
159
|
+
```js
|
|
160
|
+
let lastChangeTime = 0,
|
|
161
|
+
lastText = "";
|
|
162
|
+
// In onUpdate:
|
|
163
|
+
if (entry.text !== lastText) {
|
|
164
|
+
lastChangeTime = driver.t;
|
|
165
|
+
lastText = entry.text;
|
|
166
|
+
}
|
|
167
|
+
const isTyping = driver.t - lastChangeTime < TYPING_GRACE;
|
|
168
|
+
cursorEl.style.opacity = isTyping ? "1" : Math.sin(blink.p) > 0 ? "1" : "0";
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Cursor HEIGHT shifts on segment
|
|
172
|
+
|
|
173
|
+
Larger cursor on brand segment for emphasis (`cursorHeightEmphasis > cursorHeight`):
|
|
174
|
+
|
|
175
|
+
```js
|
|
176
|
+
cursorEl.style.height =
|
|
177
|
+
entry.segment === "brand" ? `${cursorHeightEmphasis}px` : `${cursorHeight}px`;
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Cursor reverses contrast on dark text
|
|
181
|
+
|
|
182
|
+
If a segment is rendered DARK text on light bg, cursor should swap to dark too. Manage via `entry.color` as the SOURCE OF TRUTH and read from there.
|
|
183
|
+
|
|
184
|
+
## Key Principles
|
|
185
|
+
|
|
186
|
+
- **Cursor color shifts make brand moments POP** — eye lands on the brand name because the cursor color shifts to brand accent. Without it, cursor is visual noise.
|
|
187
|
+
- **`background` property on the cursor div** — NOT `color` (cursor is a colored block, not a glyph)
|
|
188
|
+
- **Deterministic blink via sin** — never CSS `@keyframes blink`. HF seek will desync.
|
|
189
|
+
- **Cursor `display: inline-block`** — `display: inline` ignores width/height.
|
|
190
|
+
- **`vertical-align: -8px`** (or similar) — visually anchor cursor to text baseline, not full line-height.
|
|
191
|
+
- **`white-space: pre`** on text and parent — preserve trailing spaces so cursor sits at end of segment, not after collapsed space.
|
|
192
|
+
- **Color palette aligned with brand system** — 3-4 colors max for segments (main / brand / cmd / success). More and the segmentation reads as random.
|
|
193
|
+
|
|
194
|
+
## How to Choose Values
|
|
195
|
+
|
|
196
|
+
- **DURATION** — total scene length in seconds
|
|
197
|
+
- Range: 4-8 s for a single typed line; longer if the line is long
|
|
198
|
+
- Effects: too short truncates the typing; too long leaves a dead tail after the success state
|
|
199
|
+
- Constraints: must be `≥ SEQUENCE[last].t + (closing dwell)`
|
|
200
|
+
- Reference: see the corresponding blueprint's example HTML
|
|
201
|
+
|
|
202
|
+
- **SEQUENCE entry `t` values** — absolute seconds where each new visible text + segment kicks in
|
|
203
|
+
- Range: monotonically increasing; spacing 0.2-0.5 s between micro-additions (per-word or per-token), longer between segment swaps
|
|
204
|
+
- Effects: too-tight spacing collapses the typing feel into a slideshow; too-loose drags
|
|
205
|
+
- Constraints: ordered ascending; entries do not need uniform spacing — slow down on highlights
|
|
206
|
+
- Reference: see the corresponding blueprint's example HTML
|
|
207
|
+
|
|
208
|
+
- **Segment palette: mainColor / brandColor / cmdColor / successColor** — the cursor-fill swatches
|
|
209
|
+
- Range: 3-4 discrete colors max; each should be distinguishable at small cursor width
|
|
210
|
+
- Effects: too many segments and the swaps read as random; too few and the brand moment loses pop
|
|
211
|
+
- Constraints: `brandColor` and `successColor` may be similar in hue but should differ in saturation/luminance so a brand→success transition is visible
|
|
212
|
+
- Reference: see the corresponding blueprint's example HTML
|
|
213
|
+
|
|
214
|
+
- **cursorWidth / cursorHeight / cursorGap / cursorBaselineFix** — cursor block geometry
|
|
215
|
+
- Range: cursorWidth 8-24 px; cursorHeight ≈ 0.85-1.0 × fontSize; cursorGap 4-12 px; cursorBaselineFix small negative number to drop below the baseline
|
|
216
|
+
- Effects: too-thin cursor disappears in render compression; too-tall cursor visually outranks the text
|
|
217
|
+
- Constraints: must use `display: inline-block` (a `width` on `display: inline` is ignored)
|
|
218
|
+
- Reference: see the corresponding blueprint's example HTML
|
|
219
|
+
|
|
220
|
+
- **cursorHeightEmphasis** (Variations) — height when the active segment is the brand
|
|
221
|
+
- Range: 1.1-1.25 × `cursorHeight`
|
|
222
|
+
- Effects: subtle bump reads as emphasis; large bump reads as glitch
|
|
223
|
+
- Constraints: `cursorHeightEmphasis > cursorHeight`
|
|
224
|
+
- Reference: see the corresponding blueprint's example HTML
|
|
225
|
+
|
|
226
|
+
- **BLINK_CYCLES_PER_SCENE** — how many full blink cycles span `DURATION`
|
|
227
|
+
- Range: choose so the period `DURATION / BLINK_CYCLES_PER_SCENE` ≈ 0.6-1.2 s; e.g. an 8-second scene with ~1 s period uses BLINK_CYCLES_PER_SCENE = 8
|
|
228
|
+
- Effects: short period (many cycles) reads as glitchy / agitated; long period reads as terminal-idle
|
|
229
|
+
- Constraints: must be a whole number when `DURATION` is fixed — the sin sweep ends mid-cycle otherwise and the cursor pops on the last frame
|
|
230
|
+
- Reference: see the corresponding blueprint's example HTML
|
|
231
|
+
|
|
232
|
+
- **TYPING_GRACE** (Variations) — seconds after a text change during which blink is suppressed
|
|
233
|
+
- Range: 0.15-0.3 s
|
|
234
|
+
- Effects: low end still blinks while letters are still appearing; high end keeps cursor solid through long holds
|
|
235
|
+
- Constraints: must be smaller than the shortest dwell between two adjacent SEQUENCE entries — otherwise the cursor never blinks
|
|
236
|
+
- Reference: see the corresponding blueprint's example HTML
|
|
237
|
+
|
|
238
|
+
## Critical Constraints
|
|
239
|
+
|
|
240
|
+
- **Timeline must be paused**: `gsap.timeline({ paused: true })`
|
|
241
|
+
- **Registry key = `data-composition-id`**
|
|
242
|
+
- **No CSS animation** on cursor — must be timeline-driven (blink + color)
|
|
243
|
+
- **Cursor `display: inline-block`** — required for width/height
|
|
244
|
+
- **`white-space: pre`** on text container and text — preserve trailing space
|
|
245
|
+
- **Monospace font** — proportional fonts cause cursor to drift mid-segment
|
|
246
|
+
|
|
247
|
+
## Combinations
|
|
248
|
+
|
|
249
|
+
- [discrete-text-sequence.md](discrete-text-sequence.md) — uses the same SEQUENCE array pattern; this rule adds the cursor styling layer
|
|
250
|
+
- [camera-cursor-tracking.md](camera-cursor-tracking.md) — camera tracks the cursor across the typing
|
|
251
|
+
- [press-release-spring.md](press-release-spring.md) — after typing completes, a button press confirms the command
|
|
252
|
+
|
|
253
|
+
## Pairs with HF skills
|
|
254
|
+
|
|
255
|
+
- `/hyperframes-animation` — onUpdate driving cursor color + sin blink
|
|
256
|
+
- `/hyperframes-core` — composition wiring
|
|
257
|
+
- `/hyperframes-cli` — `hyperframes lint`
|