@mevdragon/vidfarm-devcli 0.14.0 → 0.16.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.css +1 -1
- package/demo/dist/app.js +369 -85
- package/dist/src/app.js +630 -140
- package/dist/src/cli.js +529 -12
- package/dist/src/composition-runtime.js +262 -3
- package/dist/src/config.js +13 -0
- 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 +256 -0
- package/dist/src/frontend/homepage-client.js +50 -1
- package/dist/src/frontend/homepage-shared.js +197 -0
- package/dist/src/frontend/homepage-store.js +10 -1
- package/dist/src/frontend/homepage-view.js +43 -5
- package/dist/src/homepage.js +51 -18
- 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/dist/src/services/serverless-records.js +9 -0
- package/package.json +2 -1
- package/public/assets/homepage-client-app.js +23 -23
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: asr-keyword-glow
|
|
3
|
+
description: Keywords glow + scale up when "spoken" — attack/sustain/release envelope synced to per-word timestamps. Even without real audio, hardcoded timings create a "narrator emphasis" effect.
|
|
4
|
+
metadata:
|
|
5
|
+
tags: asr, audio-sync, highlight, glow, keyword, text, speech, emphasis
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ASR Keyword Glow
|
|
9
|
+
|
|
10
|
+
Words in a phrase visually activate (glow blur + scale) when "spoken," following an attack-sustain-release (ASR-like) envelope. In a real ASR pipeline these timings come from word-level transcript data; for promotional video, hardcode the timings to control emphasis pacing. The envelope leaves a subtle "rest glow" after the word, creating a breadcrumb of recent emphasis.
|
|
11
|
+
|
|
12
|
+
## How It Works
|
|
13
|
+
|
|
14
|
+
Each word has `{ start, end }` timestamps. At each frame, compute the word's envelope value:
|
|
15
|
+
|
|
16
|
+
- **Pre-start** → 0 (not yet)
|
|
17
|
+
- **Start → peak** → attack (linear ramp 0 → 1)
|
|
18
|
+
- **Peak → end** → sustain (stays at 1)
|
|
19
|
+
- **End → end+release** → decay (1 → restLevel, typically 0.25)
|
|
20
|
+
- **After release** → restLevel (stays subtly highlighted)
|
|
21
|
+
|
|
22
|
+
The envelope drives `textShadow` blur radius AND `scale`. Higher blur + bigger scale = "speaking" emphasis.
|
|
23
|
+
|
|
24
|
+
## HTML
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<div
|
|
28
|
+
class="scene"
|
|
29
|
+
id="asr-scene"
|
|
30
|
+
data-composition-id="asr-scene"
|
|
31
|
+
data-start="0"
|
|
32
|
+
data-duration="6"
|
|
33
|
+
data-track-index="0"
|
|
34
|
+
>
|
|
35
|
+
<div class="phrase">
|
|
36
|
+
<!-- One <span class="word"> per word in {phrase}. data-word is a
|
|
37
|
+
stable key used to look up the word's ASR timing in JS. The
|
|
38
|
+
final word may be a {brandWord}, which gets longer emphasis
|
|
39
|
+
and the .brand modifier. -->
|
|
40
|
+
<span class="word" data-word="{w1Key}">{w1}</span>
|
|
41
|
+
<span class="word" data-word="{w2Key}">{w2}</span>
|
|
42
|
+
<!-- … -->
|
|
43
|
+
<span class="word brand" data-word="{brandKey}">{brandWord}</span>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## CSS
|
|
49
|
+
|
|
50
|
+
```css
|
|
51
|
+
.scene {
|
|
52
|
+
position: relative;
|
|
53
|
+
width: 100%;
|
|
54
|
+
height: 100%;
|
|
55
|
+
display: grid;
|
|
56
|
+
place-items: center;
|
|
57
|
+
background: {sceneBackgroundColor};
|
|
58
|
+
font-family: {font};
|
|
59
|
+
}
|
|
60
|
+
.phrase {
|
|
61
|
+
display: flex;
|
|
62
|
+
flex-wrap: wrap;
|
|
63
|
+
gap: 24px;
|
|
64
|
+
justify-content: center;
|
|
65
|
+
max-width: 1700px;
|
|
66
|
+
font-size: 120px;
|
|
67
|
+
font-weight: 900;
|
|
68
|
+
letter-spacing: 2px;
|
|
69
|
+
color: {restColor};
|
|
70
|
+
text-align: center;
|
|
71
|
+
line-height: 1.2;
|
|
72
|
+
}
|
|
73
|
+
.word {
|
|
74
|
+
display: inline-block;
|
|
75
|
+
transform-origin: 50% 50%;
|
|
76
|
+
/* Initial subtle rest glow */
|
|
77
|
+
text-shadow: 0 0 0 {glowColorTransparent};
|
|
78
|
+
will-change: transform, text-shadow;
|
|
79
|
+
}
|
|
80
|
+
.word.brand {
|
|
81
|
+
color: {brandAccentColor};
|
|
82
|
+
letter-spacing: 12px;
|
|
83
|
+
text-transform: uppercase;
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## GSAP Timeline
|
|
88
|
+
|
|
89
|
+
```html
|
|
90
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
|
91
|
+
<script>
|
|
92
|
+
window.__timelines = window.__timelines || {};
|
|
93
|
+
const tl = gsap.timeline({ paused: true });
|
|
94
|
+
|
|
95
|
+
// Per-word "spoken" times — author these to control narrator pacing.
|
|
96
|
+
// Shape: { [wordKey]: { start, end } } in local seconds. One entry
|
|
97
|
+
// per <span class="word" data-word="…">. The brand word's window is
|
|
98
|
+
// typically 1.5-2× as long as a normal word.
|
|
99
|
+
const TIMINGS = {
|
|
100
|
+
// {w1Key}: { start: …, end: … },
|
|
101
|
+
// {w2Key}: { start: …, end: … },
|
|
102
|
+
// …
|
|
103
|
+
// {brandKey}: { start: …, end: … },
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
function envelope(time, start, end) {
|
|
107
|
+
const releaseEnd = end + RELEASE;
|
|
108
|
+
if (time < start) return 0;
|
|
109
|
+
if (time < end) {
|
|
110
|
+
// attack — linear ramp over ATTACK_DUR then sustain
|
|
111
|
+
const attack = Math.min((time - start) / ATTACK_DUR, 1);
|
|
112
|
+
return attack;
|
|
113
|
+
}
|
|
114
|
+
if (time < releaseEnd) {
|
|
115
|
+
// decay to rest level
|
|
116
|
+
const decay = (time - end) / RELEASE;
|
|
117
|
+
return 1 - decay * (1 - REST_LEVEL);
|
|
118
|
+
}
|
|
119
|
+
return REST_LEVEL;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const words = document.querySelectorAll(".word");
|
|
123
|
+
|
|
124
|
+
// Single driver — 0 → composition duration
|
|
125
|
+
const driver = { t: 0 };
|
|
126
|
+
tl.to(
|
|
127
|
+
driver,
|
|
128
|
+
{
|
|
129
|
+
t: SCENE_DURATION,
|
|
130
|
+
duration: SCENE_DURATION,
|
|
131
|
+
ease: "none",
|
|
132
|
+
onUpdate: () => {
|
|
133
|
+
words.forEach((el) => {
|
|
134
|
+
const word = el.dataset.word;
|
|
135
|
+
const timing = TIMINGS[word];
|
|
136
|
+
if (!timing) return;
|
|
137
|
+
const env = envelope(driver.t, timing.start, timing.end);
|
|
138
|
+
const blur = MAX_BLUR * env;
|
|
139
|
+
const scale = 1 + MAX_SCALE_BOOST * env;
|
|
140
|
+
el.style.textShadow = `0 0 ${blur}px ${glowColorRgba(env)}`;
|
|
141
|
+
el.style.transform = `scale(${scale})`;
|
|
142
|
+
});
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
0,
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
window.__timelines["asr-scene"] = tl;
|
|
149
|
+
</script>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
`glowColorRgba(env)` returns the brand glow color with `env`-modulated alpha (e.g. `rgba({glowR}, {glowG}, {glowB}, ${GLOW_ALPHA_BASE + env * GLOW_ALPHA_RANGE})`).
|
|
153
|
+
|
|
154
|
+
## Variations
|
|
155
|
+
|
|
156
|
+
### Multi-octave glow (more dramatic peaks)
|
|
157
|
+
|
|
158
|
+
Combine the envelope-driven blur with a sin pulse during the sustain phase — high-emphasis words breathe at peak. The sine frequency `PULSE_HZ` controls how many breaths fit in the sustain window; amplitude `PULSE_AMPLITUDE` controls how visible the breath is.
|
|
159
|
+
|
|
160
|
+
```js
|
|
161
|
+
const sustain = env * (1 + Math.sin(driver.t * PULSE_HZ) * PULSE_AMPLITUDE);
|
|
162
|
+
const blur = MAX_BLUR * sustain;
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Color shift on the peak
|
|
166
|
+
|
|
167
|
+
The active word lerps from `restColor` → `peakColor` as `env` rises, settling back to `restColor` at rest:
|
|
168
|
+
|
|
169
|
+
```js
|
|
170
|
+
function lerpChannel(a, b, t) {
|
|
171
|
+
return Math.round(a + (b - a) * t);
|
|
172
|
+
}
|
|
173
|
+
el.style.color = `rgb(${lerpChannel(REST_RGB.r, PEAK_RGB.r, env)}, ${lerpChannel(REST_RGB.g, PEAK_RGB.g, env)}, ${lerpChannel(REST_RGB.b, PEAK_RGB.b, env)})`;
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Karaoke style (dim-rest + bright-active, RECOMMENDED for video narration)
|
|
177
|
+
|
|
178
|
+
Default amplitudes (small MAX_BLUR, small MAX_SCALE_BOOST, rest text full white) read as too subtle in video — the inactive words still dominate. Karaoke style fixes this: **inactive words rendered DIM**, active words **lerp toward bright white + larger scale**:
|
|
179
|
+
|
|
180
|
+
```js
|
|
181
|
+
// Tunable constants — see How to Choose Values
|
|
182
|
+
// REST_RGB — dim color for inactive words
|
|
183
|
+
// ACTIVE_RGB — bright color at peak (non-brand)
|
|
184
|
+
// BRAND_RGB — bright color at peak (brand word)
|
|
185
|
+
// MAX_BLUR, MAX_SCALE_BOOST, REST_LEVEL all pushed higher than default
|
|
186
|
+
|
|
187
|
+
function lerpChannel(a, b, t) {
|
|
188
|
+
return Math.round(a + (b - a) * t);
|
|
189
|
+
}
|
|
190
|
+
function colorAt(env, isBrand) {
|
|
191
|
+
const target = isBrand ? BRAND_RGB : ACTIVE_RGB;
|
|
192
|
+
return `rgb(${lerpChannel(REST_RGB.r, target.r, env)}, ${lerpChannel(REST_RGB.g, target.g, env)}, ${lerpChannel(REST_RGB.b, target.b, env)})`;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// In onUpdate:
|
|
196
|
+
el.style.color = colorAt(env, el.classList.contains("brand"));
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Visual result: at any moment 1-2 words are bright + glowing (the spoken word + the recently-spoken one's lingering rest), and the rest of the phrase is dim. This is closer to actual karaoke / lyric video aesthetic than the subtle "everyone half-glowing" baseline.
|
|
200
|
+
|
|
201
|
+
When to use karaoke vs default: short narration phrases (5-10 words) where one word at a time should clearly POP → karaoke. Long dense text where many words emphasize subtly → default subtle. Karaoke pushes MAX_BLUR, MAX_SCALE_BOOST, and contrast between REST_RGB and ACTIVE_RGB; everything else is identical.
|
|
202
|
+
|
|
203
|
+
### 3D pop-out
|
|
204
|
+
|
|
205
|
+
Combine envelope with `translateZ` for words to "lean toward camera" as they speak:
|
|
206
|
+
|
|
207
|
+
```js
|
|
208
|
+
const popZ = env * MAX_POP_Z;
|
|
209
|
+
el.style.transform = `translateZ(${popZ}px) scale(${scale})`;
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Requires `perspective` on the parent.
|
|
213
|
+
|
|
214
|
+
### From real ASR transcripts
|
|
215
|
+
|
|
216
|
+
For real ASR-driven scenes, replace hardcoded TIMINGS with transcript JSON (each entry has `word`, `start_ms`, `end_ms`). Convert to seconds and feed in identically. The shape `{ [wordKey]: { start, end } }` is the same whether hand-authored or derived from `hyperframes transcribe`.
|
|
217
|
+
|
|
218
|
+
## How to Choose Values
|
|
219
|
+
|
|
220
|
+
- **TIMINGS** — per-word `{ start, end }` map. Author one entry per `.word` span.
|
|
221
|
+
- Shape: `{ wordKey: { start: number, end: number } }`, all seconds local to the scene.
|
|
222
|
+
- Constraints: monotonic non-overlap — every entry's `end < next entry's start` (overlapping windows make the envelope ambiguous).
|
|
223
|
+
- Brand word window: typically 1.5-2× the average non-brand word window so the brand sustains.
|
|
224
|
+
- **ATTACK_DUR** — seconds for the envelope to ramp 0 → 1 once a word starts.
|
|
225
|
+
- Range: 0.1-0.25 s
|
|
226
|
+
- Effects: shorter feels punchy and ASR-like; longer feels smoothed-out.
|
|
227
|
+
- Constraints: must be < (smallest word's end - start), otherwise the word never reaches 1.
|
|
228
|
+
- **RELEASE** — seconds for the envelope to decay 1 → REST_LEVEL after a word ends.
|
|
229
|
+
- Range: 0.2-0.5 s
|
|
230
|
+
- **REST_LEVEL** — held envelope value after RELEASE.
|
|
231
|
+
- Range: 0.15-0.4 (default style); 0.05-0.2 (karaoke style — dimmer rest).
|
|
232
|
+
- Effects: lower = quieter breadcrumb; higher = more recently-spoken words stay bright.
|
|
233
|
+
- Constraints: must be < 1; should be > 0 to preserve the breadcrumb.
|
|
234
|
+
- **MAX_BLUR** — peak `text-shadow` blur radius in px.
|
|
235
|
+
- Range: 15-25 px (default style); 30-45 px (karaoke style).
|
|
236
|
+
- Effects: bigger reads as "shouting"; smaller reads as "neutral narration".
|
|
237
|
+
- **MAX_SCALE_BOOST** — additive scale at peak (e.g. 0.08 ⇒ 1.0 → 1.08).
|
|
238
|
+
- Range: 0.03-0.10 (default style); 0.15-0.25 (karaoke style).
|
|
239
|
+
- Effects: bigger reads as "bouncy"; smaller reads as "just glowing".
|
|
240
|
+
- **SCENE_DURATION** — total seconds for the single driver tween.
|
|
241
|
+
- Constraints: must equal the scene's `data-duration` so the driver `t` reaches the end of TIMINGS in sync with HF's seek.
|
|
242
|
+
- **REST_RGB / ACTIVE_RGB / BRAND_RGB** (karaoke style) — discrete color choices, not numeric.
|
|
243
|
+
- REST_RGB: dim tone of the brand palette's neutral; should read as off-white-ish dim, not black.
|
|
244
|
+
- ACTIVE_RGB: brand text color at full readability.
|
|
245
|
+
- BRAND_RGB: brand accent color (often the same hue as the glow).
|
|
246
|
+
- **PULSE_HZ / PULSE_AMPLITUDE** (multi-octave variation) — sine breath frequency / depth.
|
|
247
|
+
- PULSE_HZ range: 4-10 rad/s; PULSE_AMPLITUDE range: 0.1-0.3.
|
|
248
|
+
- **MAX_POP_Z** (3D pop-out variation) — max Z translation at peak (px).
|
|
249
|
+
- Range: 20-60 px; requires parent `perspective`.
|
|
250
|
+
|
|
251
|
+
Ease family — discrete choice:
|
|
252
|
+
|
|
253
|
+
- Single linear driver (`ease: "none"`) so `t` maps 1:1 to scene time. Any other ease distorts the per-word envelope shape — do not change.
|
|
254
|
+
|
|
255
|
+
## Key Principles
|
|
256
|
+
|
|
257
|
+
- **Envelope shape: attack-sustain-decay-rest** — never zero out after a word. The rest level (REST_LEVEL > 0) keeps the recently-spoken words subtly highlighted, creating a "breadcrumb" of attention.
|
|
258
|
+
- **Brand word gets longer emphasis (1.5-2× normal)** — the brand is the headline; let it sustain.
|
|
259
|
+
- **`display: inline-block`** on each word — required for `transform` to apply to `<span>`.
|
|
260
|
+
- **MAX_BLUR and MAX_SCALE_BOOST stay in their default-style ranges unless you commit to karaoke** — picking values between default and karaoke yields awkward "half-loud" emphasis.
|
|
261
|
+
- **Per-word `text-shadow`** (not `box-shadow`) — text-shadow is the glow around the GLYPH, which is what reads as "speaking emphasis." Box-shadow would glow around the inline-block bounding box (rectangle).
|
|
262
|
+
- **Single driver, multi-word onUpdate** — one tween that loops over all words. Don't create one tween per word — at 60+ words the timeline becomes unwieldy.
|
|
263
|
+
- **❗ Climax dwell ≥1s** — after the final word's emphasis, comp continues ≥1s. The last word IS the headline beat.
|
|
264
|
+
|
|
265
|
+
## Critical Constraints
|
|
266
|
+
|
|
267
|
+
- **Timeline must be paused**: `gsap.timeline({ paused: true })`
|
|
268
|
+
- **Registry key = `data-composition-id`**
|
|
269
|
+
- **No CSS animation** on word elements
|
|
270
|
+
- **`display: inline-block`** on each `.word`
|
|
271
|
+
- **`will-change: transform, text-shadow`** on `.word`
|
|
272
|
+
- **Timings monotonic** (later start > earlier end) — overlapping words mess up the envelope
|
|
273
|
+
|
|
274
|
+
## Combinations
|
|
275
|
+
|
|
276
|
+
- [3d-text-depth-layers.md](3d-text-depth-layers.md) — the active word gets depth-layered emphasis at peak
|
|
277
|
+
- [sine-wave-loop.md](sine-wave-loop.md) — non-active words breathe subtly between emphasis moments
|
|
278
|
+
- [context-sensitive-cursor.md](context-sensitive-cursor.md) — typewriter that types each word matching the ASR cadence
|
|
279
|
+
|
|
280
|
+
## Pairs with HF skills
|
|
281
|
+
|
|
282
|
+
- `/hyperframes-animation` — single driver, multi-element envelope
|
|
283
|
+
- `/hyperframes-media` — `hyperframes transcribe` outputs real ASR data
|
|
284
|
+
- `/hyperframes-media` — pair with caption rendering
|
|
285
|
+
- `/hyperframes-core` — composition wiring
|
|
286
|
+
- `/hyperframes-cli` — `hyperframes lint`
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: avatar-cloud-network
|
|
3
|
+
description: Avatars distributed on an elliptical ring connected by SVG dashed lines to a center hub — social proof "community" reveal with staggered entry.
|
|
4
|
+
metadata:
|
|
5
|
+
tags: avatar, cloud, network, social-proof, ellipse, connection, stagger
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Avatar Cloud Network
|
|
9
|
+
|
|
10
|
+
Avatars arranged on an elliptical ring around a central element (logo / counter / brand). SVG dashed connection lines from center to each avatar. Staggered spring entry on avatars, then connection lines draw outward — communicates "community" or "social proof." Distinct from [orbit-3d-entry](orbit-3d-entry.md) (which continuously orbits) — avatar-cloud is a static composed reveal.
|
|
11
|
+
|
|
12
|
+
## How It Works
|
|
13
|
+
|
|
14
|
+
Three rendering layers:
|
|
15
|
+
|
|
16
|
+
1. **SVG connection lines** (z-index 1, behind everything) — line from center hub to each avatar's position
|
|
17
|
+
2. **Avatars** (z-index 2) — `<div>` circles on elliptical positions
|
|
18
|
+
3. **Center hub** (z-index 5) — brand counter or logo (sits ABOVE the lines that converge on it)
|
|
19
|
+
|
|
20
|
+
Animation phases:
|
|
21
|
+
|
|
22
|
+
- `HUB_FADE_START → HUB_FADE_START + HUB_FADE_DUR`: hub fades in
|
|
23
|
+
- `AVATAR_ENTRY_START → AVATAR_ENTRY_START + (AVATAR_COUNT − 1) × AVATAR_STAGGER + AVATAR_ENTRY_DUR`: avatars cascade in
|
|
24
|
+
- `LINES_START → LINES_START + (AVATAR_COUNT − 1) × LINE_STAGGER + LINES_DUR`: connection lines draw outward
|
|
25
|
+
- climax dwell: optional idle breathing on avatars (see Variations / sine-wave-loop)
|
|
26
|
+
|
|
27
|
+
## HTML
|
|
28
|
+
|
|
29
|
+
```html
|
|
30
|
+
<div
|
|
31
|
+
class="scene"
|
|
32
|
+
id="cloud-scene"
|
|
33
|
+
data-composition-id="cloud-scene"
|
|
34
|
+
data-start="0"
|
|
35
|
+
data-duration="4"
|
|
36
|
+
data-track-index="0"
|
|
37
|
+
>
|
|
38
|
+
<!-- Connection lines layer -->
|
|
39
|
+
<svg class="lines" viewBox="0 0 1920 1080" xmlns="http://www.w3.org/2000/svg">
|
|
40
|
+
<!-- Lines injected by script — center to each avatar -->
|
|
41
|
+
</svg>
|
|
42
|
+
|
|
43
|
+
<!-- Avatars + center hub -->
|
|
44
|
+
<div class="hub-wrap">
|
|
45
|
+
<div class="hub" id="hub">
|
|
46
|
+
<div class="hub-num" id="hub-num">{counterValue}</div>
|
|
47
|
+
<div class="hub-label">{counterLabel}</div>
|
|
48
|
+
</div>
|
|
49
|
+
<!-- Avatars injected by script — AVATAR_COUNT around the ellipse -->
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<div class="brand">{footerLine}</div>
|
|
53
|
+
</div>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Placeholder tokens:
|
|
57
|
+
|
|
58
|
+
- `{counterValue}` / `{counterLabel}` — the hub copy (numeric proof + category)
|
|
59
|
+
- `{footerLine}` — optional attribution line under the cloud
|
|
60
|
+
- `{avatar[i]}` — per-avatar image source (or emoji glyph if using the emoji variation below)
|
|
61
|
+
|
|
62
|
+
## CSS
|
|
63
|
+
|
|
64
|
+
```css
|
|
65
|
+
.scene {
|
|
66
|
+
position: relative;
|
|
67
|
+
width: 100%;
|
|
68
|
+
height: 100%;
|
|
69
|
+
background: {bgColor};
|
|
70
|
+
font-family: {font};
|
|
71
|
+
overflow: hidden;
|
|
72
|
+
}
|
|
73
|
+
.lines {
|
|
74
|
+
position: absolute;
|
|
75
|
+
inset: 0;
|
|
76
|
+
width: 100%;
|
|
77
|
+
height: 100%;
|
|
78
|
+
pointer-events: none;
|
|
79
|
+
z-index: 1;
|
|
80
|
+
}
|
|
81
|
+
.hub-wrap {
|
|
82
|
+
position: absolute;
|
|
83
|
+
inset: 0;
|
|
84
|
+
display: grid;
|
|
85
|
+
place-items: center;
|
|
86
|
+
}
|
|
87
|
+
.hub {
|
|
88
|
+
position: relative;
|
|
89
|
+
z-index: 5;
|
|
90
|
+
display: flex;
|
|
91
|
+
flex-direction: column;
|
|
92
|
+
align-items: center;
|
|
93
|
+
gap: 12px;
|
|
94
|
+
padding: 48px 64px;
|
|
95
|
+
border-radius: 28px;
|
|
96
|
+
background: {hubBg};
|
|
97
|
+
border: 1px solid {hubBorder};
|
|
98
|
+
}
|
|
99
|
+
.hub-num {
|
|
100
|
+
font-size: HUB_NUM_FONT_SIZE;
|
|
101
|
+
font-weight: 900;
|
|
102
|
+
color: {textColor};
|
|
103
|
+
letter-spacing: -4px;
|
|
104
|
+
line-height: 1;
|
|
105
|
+
font-variant-numeric: tabular-nums;
|
|
106
|
+
}
|
|
107
|
+
.hub-label {
|
|
108
|
+
font-size: HUB_LABEL_FONT_SIZE;
|
|
109
|
+
font-weight: 800;
|
|
110
|
+
letter-spacing: 12px;
|
|
111
|
+
color: {accentColor};
|
|
112
|
+
text-transform: uppercase;
|
|
113
|
+
}
|
|
114
|
+
.avatar {
|
|
115
|
+
position: absolute;
|
|
116
|
+
z-index: 2;
|
|
117
|
+
width: AVATAR_SIZE;
|
|
118
|
+
height: AVATAR_SIZE;
|
|
119
|
+
border-radius: 50%;
|
|
120
|
+
border: 3px solid {avatarBorder};
|
|
121
|
+
box-shadow:
|
|
122
|
+
0 12px 32px rgba(0, 0, 0, 0.5),
|
|
123
|
+
0 0 24px {avatarGlow};
|
|
124
|
+
display: grid;
|
|
125
|
+
place-items: center;
|
|
126
|
+
font-size: AVATAR_GLYPH_SIZE;
|
|
127
|
+
background: {avatarBg};
|
|
128
|
+
will-change: transform, opacity;
|
|
129
|
+
/* Top-left positioned by script; transform centers via -50% trick */
|
|
130
|
+
transform: translate(-50%, -50%);
|
|
131
|
+
}
|
|
132
|
+
.brand {
|
|
133
|
+
position: absolute;
|
|
134
|
+
bottom: 80px;
|
|
135
|
+
left: 50%;
|
|
136
|
+
transform: translateX(-50%);
|
|
137
|
+
font-size: BRAND_FONT_SIZE;
|
|
138
|
+
font-weight: 900;
|
|
139
|
+
letter-spacing: 14px;
|
|
140
|
+
color: {accentColor};
|
|
141
|
+
text-transform: uppercase;
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## GSAP Timeline
|
|
146
|
+
|
|
147
|
+
```html
|
|
148
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
|
149
|
+
<script>
|
|
150
|
+
window.__timelines = window.__timelines || {};
|
|
151
|
+
const tl = gsap.timeline({ paused: true });
|
|
152
|
+
|
|
153
|
+
// CENTER_X / CENTER_Y must match the hub's rendered center exactly.
|
|
154
|
+
// For a hub-wrap with place-items:center on a 1920×1080 canvas these are
|
|
155
|
+
// (compositionWidth/2, compositionHeight × CENTER_Y_FACTOR).
|
|
156
|
+
const SCREEN_CENTER = { x: CENTER_X, y: CENTER_Y };
|
|
157
|
+
|
|
158
|
+
const hubWrap = document.querySelector(".hub-wrap");
|
|
159
|
+
const linesSvg = document.querySelector(".lines");
|
|
160
|
+
|
|
161
|
+
// Build avatars + lines
|
|
162
|
+
const avatarPositions = [];
|
|
163
|
+
for (let i = 0; i < AVATAR_COUNT; i++) {
|
|
164
|
+
const angle = (i / AVATAR_COUNT) * Math.PI * 2 - Math.PI / 2; // start at top
|
|
165
|
+
const x = SCREEN_CENTER.x + Math.cos(angle) * RADIUS_X;
|
|
166
|
+
const y = SCREEN_CENTER.y + Math.sin(angle) * RADIUS_Y;
|
|
167
|
+
avatarPositions.push({ x, y, angle });
|
|
168
|
+
|
|
169
|
+
// Avatar
|
|
170
|
+
const av = document.createElement("div");
|
|
171
|
+
av.className = "avatar";
|
|
172
|
+
av.style.left = `${x}px`;
|
|
173
|
+
av.style.top = `${y}px`;
|
|
174
|
+
// assign avatar image / glyph from your authoring data (see {avatar[i]})
|
|
175
|
+
hubWrap.appendChild(av);
|
|
176
|
+
|
|
177
|
+
// Line from hub to avatar
|
|
178
|
+
const line = document.createElementNS("http://www.w3.org/2000/svg", "line");
|
|
179
|
+
line.setAttribute("x1", SCREEN_CENTER.x);
|
|
180
|
+
line.setAttribute("y1", SCREEN_CENTER.y);
|
|
181
|
+
line.setAttribute("x2", x);
|
|
182
|
+
line.setAttribute("y2", y);
|
|
183
|
+
line.setAttribute("stroke", "{lineColor}");
|
|
184
|
+
line.setAttribute("stroke-width", "2");
|
|
185
|
+
line.setAttribute("stroke-dasharray", "6 8");
|
|
186
|
+
const len = Math.hypot(x - SCREEN_CENTER.x, y - SCREEN_CENTER.y);
|
|
187
|
+
line.style.strokeDashoffset = String(len);
|
|
188
|
+
line.dataset.length = String(len);
|
|
189
|
+
line.dataset.index = String(i);
|
|
190
|
+
linesSvg.appendChild(line);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Phase 1 — hub fade in
|
|
194
|
+
tl.from(
|
|
195
|
+
".hub",
|
|
196
|
+
{ opacity: 0, scale: 0.8, duration: HUB_FADE_DUR, ease: `back.out(${HUB_BOUNCE})` },
|
|
197
|
+
HUB_FADE_START,
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
// Phase 2 — avatars cascade-in (staggered spring)
|
|
201
|
+
const avatars = document.querySelectorAll(".avatar");
|
|
202
|
+
avatars.forEach((av, i) => {
|
|
203
|
+
tl.from(
|
|
204
|
+
av,
|
|
205
|
+
{
|
|
206
|
+
opacity: 0,
|
|
207
|
+
scale: 0,
|
|
208
|
+
duration: AVATAR_ENTRY_DUR,
|
|
209
|
+
ease: `back.out(${AVATAR_BOUNCE})`,
|
|
210
|
+
},
|
|
211
|
+
AVATAR_ENTRY_START + i * AVATAR_STAGGER,
|
|
212
|
+
);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// Phase 3 — connection lines draw outward (staggered) — starts after most avatars land
|
|
216
|
+
const lines = linesSvg.querySelectorAll("line");
|
|
217
|
+
lines.forEach((line, i) => {
|
|
218
|
+
tl.to(
|
|
219
|
+
line,
|
|
220
|
+
{
|
|
221
|
+
strokeDashoffset: 0,
|
|
222
|
+
duration: LINES_DUR,
|
|
223
|
+
ease: "power2.out",
|
|
224
|
+
},
|
|
225
|
+
LINES_START + i * LINE_STAGGER,
|
|
226
|
+
);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// Phase 4 — climax dwell (network fully formed), idle breathing on avatars
|
|
230
|
+
// (see sine-wave-loop.md for the multiplicative onUpdate form)
|
|
231
|
+
const breathDriver = { p: 0 };
|
|
232
|
+
tl.to(
|
|
233
|
+
breathDriver,
|
|
234
|
+
{
|
|
235
|
+
p: Math.PI * 2 * BREATH_CYCLES,
|
|
236
|
+
duration: BREATH_DUR,
|
|
237
|
+
ease: "none",
|
|
238
|
+
onUpdate: () => {
|
|
239
|
+
avatars.forEach((av, i) => {
|
|
240
|
+
const phase = breathDriver.p + (i / avatars.length) * Math.PI * 2;
|
|
241
|
+
const s = 1 + Math.sin(phase) * BREATH_AMP;
|
|
242
|
+
av.style.transform = `translate(-50%, -50%) scale(${s})`;
|
|
243
|
+
});
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
BREATH_START,
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
window.__timelines["cloud-scene"] = tl;
|
|
250
|
+
</script>
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## How to Choose Values
|
|
254
|
+
|
|
255
|
+
### Geometry
|
|
256
|
+
|
|
257
|
+
- **CENTER_X / CENTER_Y** — px coordinates of the hub center; lines and avatar positions derive from these.
|
|
258
|
+
- Constraints: **must equal the hub's actual rendered center** — when this rule is composed with another scene (e.g. a logo that has been recentered), `CENTER_X / CENTER_Y` must be baked from the same source as the hub's final position
|
|
259
|
+
- Reference: ../../examples/proof-logo-chain.html uses `(W/2, H × 0.47)` so the cloud sits slightly above the canvas midline
|
|
260
|
+
- **RADIUS_X / RADIUS_Y** — ellipse radii in px (RADIUS_X ≥ RADIUS_Y reads as perspective).
|
|
261
|
+
- Range: `RADIUS_X` ~ 20-30% of viewport width; `RADIUS_Y` ~ 18-25% of viewport height
|
|
262
|
+
- Constraints: `RADIUS_X / RADIUS_Y` ratio between 1.5 and 3.0 reads as natural depth; ratio = 1 (circle) reads as a flat 2D layout
|
|
263
|
+
- Reference: ../../examples/proof-logo-chain.html uses `W * 0.25` (`480px`) and `H * 0.22` (`237.6px`)
|
|
264
|
+
- **AVATAR_COUNT** — number of avatars distributed around the ring.
|
|
265
|
+
- Range: 8-12; fewer feels sparse, more clutters the ellipse
|
|
266
|
+
- Reference: ../../examples/proof-logo-chain.html uses `10`
|
|
267
|
+
- **AVATAR_SIZE / AVATAR_GLYPH_SIZE** — px diameter of each avatar circle and (optional) inner glyph size.
|
|
268
|
+
- Range: `AVATAR_SIZE` ~ 80-120 px at 1920 wide; small enough that 10+ avatars fit the ring without overlap
|
|
269
|
+
- **HUB_NUM_FONT_SIZE / HUB_LABEL_FONT_SIZE / BRAND_FONT_SIZE** — hub typography.
|
|
270
|
+
- Constraints: hub-num is the focal beat, sized 2-4× the label
|
|
271
|
+
|
|
272
|
+
### Hub fade
|
|
273
|
+
|
|
274
|
+
- **HUB_FADE_START** — when the hub fades in.
|
|
275
|
+
- Range: usually `0` (the hub establishes the focal point); offset if the scene precedes with another beat
|
|
276
|
+
- **HUB_FADE_DUR** — hub fade-in duration.
|
|
277
|
+
- Range: 0.4-0.6s
|
|
278
|
+
- **HUB_BOUNCE** — `back.out(HUB_BOUNCE)` coefficient on the hub's scale entry.
|
|
279
|
+
- Range: 1.4 (subtle) → 1.8 (firm)
|
|
280
|
+
|
|
281
|
+
### Avatar cascade
|
|
282
|
+
|
|
283
|
+
- **AVATAR_ENTRY_START** — when the first avatar pops in.
|
|
284
|
+
- Constraints: `≥ HUB_FADE_START + HUB_FADE_DUR × 0.6` so the hub is established before satellites arrive
|
|
285
|
+
- **AVATAR_ENTRY_DUR** — per-avatar scale-up duration.
|
|
286
|
+
- Range: 0.4-0.7s
|
|
287
|
+
- **AVATAR_STAGGER** — delay between consecutive avatar entries.
|
|
288
|
+
- Range: 0.06-0.10s; cascade reads as "joining"; simultaneous reads as "all already there"
|
|
289
|
+
- **AVATAR_BOUNCE** — `back.out(AVATAR_BOUNCE)` coefficient on each avatar's pop.
|
|
290
|
+
- Range: 1.4 (gentle) → 1.8 (firm); slightly firmer than hub for differentiation
|
|
291
|
+
|
|
292
|
+
### Connection lines
|
|
293
|
+
|
|
294
|
+
- **LINES_START** — when the lines begin drawing outward.
|
|
295
|
+
- Constraints: `LINES_START + (AVATAR_COUNT − 1) × LINE_STAGGER` should overlap the last avatar's settle by ~0.1-0.2s so the drawing reads as a consequence of the avatars landing
|
|
296
|
+
- **LINES_DUR** — per-line draw duration (strokeDashoffset → 0).
|
|
297
|
+
- Range: 0.4-0.7s
|
|
298
|
+
- **LINE_STAGGER** — delay between consecutive lines starting.
|
|
299
|
+
- Range: 0.02-0.05s; tight stagger reads as a wave outward
|
|
300
|
+
|
|
301
|
+
### Idle breathing
|
|
302
|
+
|
|
303
|
+
- **BREATH_START** — when idle breathing activates.
|
|
304
|
+
- Constraints: `≥ LINES_START + (AVATAR_COUNT − 1) × LINE_STAGGER + LINES_DUR + ~0.2s` (let the lines settle)
|
|
305
|
+
- **BREATH_DUR** — total duration of the breathing tween.
|
|
306
|
+
- Range: fills the remaining composition window
|
|
307
|
+
- **BREATH_CYCLES** — number of full sine cycles across `BREATH_DUR`.
|
|
308
|
+
- Range: 1.0-2.0; under 1 reads as a single sigh, over 2 starts to look anxious
|
|
309
|
+
- **BREATH_AMP** — sine amplitude on scale (multiplicative).
|
|
310
|
+
- Range: 0.02-0.06; smaller for headshots, larger for stylized glyphs
|
|
311
|
+
|
|
312
|
+
### Color tokens
|
|
313
|
+
|
|
314
|
+
- **{bgColor}** — stage background (typically a dark gradient so the cloud reads as a constellation)
|
|
315
|
+
- **{textColor}** — hub-num color (primary copy)
|
|
316
|
+
- **{accentColor}** — hub-label + footer (the brand voice)
|
|
317
|
+
- **{hubBg} / {hubBorder}** — hub card surfaces; gradient + 1px border reads as elevated
|
|
318
|
+
- **{avatarBg} / {avatarBorder} / {avatarGlow}** — avatar circle styling; soft border + glow keeps them legible on dark backgrounds
|
|
319
|
+
- **{lineColor}** — SVG stroke color (translucent accent reads as networky)
|
|
320
|
+
- **{font}** — base typography stack
|
|
321
|
+
|
|
322
|
+
## Variations
|
|
323
|
+
|
|
324
|
+
### Avatar size variation (organic feel)
|
|
325
|
+
|
|
326
|
+
Vary avatar sizes by index — e.g. a small index-keyed array of sizes — so the ring doesn't read as rigidly repetitive.
|
|
327
|
+
|
|
328
|
+
### Solid lines instead of dashed
|
|
329
|
+
|
|
330
|
+
Drop `stroke-dasharray` and use a solid stroke. Drop the dash-draw animation; lines fade in via opacity instead. More corporate, less networky.
|
|
331
|
+
|
|
332
|
+
### Multi-orbit (concentric rings)
|
|
333
|
+
|
|
334
|
+
Two layers of avatars: smaller inner ring (fewer avatars, slightly larger size), larger outer ring (more, smaller). Lines connect ONLY inner ring to hub; outer ring is a "halo."
|
|
335
|
+
|
|
336
|
+
### Country / role glyphs (geographic or persona spread)
|
|
337
|
+
|
|
338
|
+
Replace face images with flags / emoji / iconography. Reads as "global community" or "diverse roles."
|
|
339
|
+
|
|
340
|
+
## Key Principles
|
|
341
|
+
|
|
342
|
+
- **Hub above lines (`z-index: 5` vs lines `z-index: 1`)** — lines should appear to terminate AT the hub edge, not pass through. Hub must be in front.
|
|
343
|
+
- **Lines drawn outward (dash offset 0)** — drawing FROM center is the visual narrative: "the hub connects to its community."
|
|
344
|
+
- **8-12 avatars** — fewer feels sparse, more clutters the ellipse.
|
|
345
|
+
- **`RADIUS_X > RADIUS_Y`** — horizontal ellipse reads as perspective; equal radii (circle) reads as 2D flat layout.
|
|
346
|
+
- **Avatar entry stagger 0.06-0.10s** — cascade reads as "joining"; simultaneous reads as "all already there."
|
|
347
|
+
- **Stagger lines AFTER avatars are mostly settled** — line draw starts ~0.1-0.2s before last avatar settles for overlap.
|
|
348
|
+
- **Idle breathing post-formation** — each avatar slightly out-of-phase. Holds the eye during climax dwell.
|
|
349
|
+
- **❗ Climax dwell ≥1s** — after lines complete, hold for ≥1s so the formed network is readable.
|
|
350
|
+
|
|
351
|
+
## Critical Constraints
|
|
352
|
+
|
|
353
|
+
- **Timeline must be paused**: `gsap.timeline({ paused: true })`
|
|
354
|
+
- **Registry key = `data-composition-id`**
|
|
355
|
+
- **No CSS animation** on avatars or lines
|
|
356
|
+
- **`will-change: transform, opacity`** on avatars
|
|
357
|
+
- **SVG `pointer-events: none`** — decorative overlay
|
|
358
|
+
- **`getTotalLength()` not needed for straight lines** — use `Math.hypot` for line length (cheaper, exact)
|
|
359
|
+
- **Hub `z-index` > lines z-index** — explicit layering
|
|
360
|
+
|
|
361
|
+
## Combinations
|
|
362
|
+
|
|
363
|
+
- [counting-dynamic-scale.md](counting-dynamic-scale.md) — the hub IS a growing counter
|
|
364
|
+
- [sine-wave-loop.md](sine-wave-loop.md) — avatar idle breathing pattern
|
|
365
|
+
- [3d-text-depth-layers.md](3d-text-depth-layers.md) — hub label with depth layers
|
|
366
|
+
|
|
367
|
+
## Pairs with HF skills
|
|
368
|
+
|
|
369
|
+
- `/hyperframes-animation` — staggered spring entries + SVG dash draw
|
|
370
|
+
- `/hyperframes-core` — composition wiring
|
|
371
|
+
- `/hyperframes-cli` — `hyperframes lint`
|