@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,350 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: physics-press-reaction
|
|
3
|
+
description: Cursor + element synchronized press via subtractive spring forces — cursor lands on element, both compress together, then release. Distinct from press-release-spring (which has no cursor).
|
|
4
|
+
metadata:
|
|
5
|
+
tags: spring, click, physics, cursor, subtractive, interaction, synchronized
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Physics Press Reaction (Cursor + Element Synced)
|
|
9
|
+
|
|
10
|
+
Models a real click: a cursor approaches a button, lands, and both compress IN SYNC, then release together. Two distinct timing events (down-frame and up-frame) bound by spring forces. Distinct from [press-release-spring](press-release-spring.md) (which has no cursor — just a press happening); this rule is the COMBINED cursor + element behavior.
|
|
11
|
+
|
|
12
|
+
## How It Works
|
|
13
|
+
|
|
14
|
+
A single `PRESS_INTENSITY` value drives both cursor and button together:
|
|
15
|
+
|
|
16
|
+
- **press down**: both compress to `1 - PRESS_INTENSITY`
|
|
17
|
+
- **release**: both spring back to 1.0 with overshoot
|
|
18
|
+
|
|
19
|
+
The cursor ALSO translates to the button's center during the approach phase BEFORE press starts. After release, the cursor may move on (next interaction) or hold.
|
|
20
|
+
|
|
21
|
+
## HTML
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<div
|
|
25
|
+
class="scene"
|
|
26
|
+
id="press-react-scene"
|
|
27
|
+
data-composition-id="press-react-scene"
|
|
28
|
+
data-start="0"
|
|
29
|
+
data-duration="3"
|
|
30
|
+
data-track-index="0"
|
|
31
|
+
>
|
|
32
|
+
<div class="stack">
|
|
33
|
+
<button class="btn" id="btn">
|
|
34
|
+
<span class="btn-icon">{ctaIcon}</span>
|
|
35
|
+
<span class="btn-label">{ctaCopy}</span>
|
|
36
|
+
</button>
|
|
37
|
+
<div class="brand">{Brand}</div>
|
|
38
|
+
</div>
|
|
39
|
+
<!-- Cursor lives at scene-root level so it can translate freely -->
|
|
40
|
+
<svg class="cursor" id="cursor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
41
|
+
<path
|
|
42
|
+
d="M3 2 L21 12 L12 13 L7 22 Z"
|
|
43
|
+
fill="{cursorFill}"
|
|
44
|
+
stroke="{cursorStroke}"
|
|
45
|
+
stroke-width="1.5"
|
|
46
|
+
/>
|
|
47
|
+
</svg>
|
|
48
|
+
</div>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## CSS
|
|
52
|
+
|
|
53
|
+
```css
|
|
54
|
+
.scene {
|
|
55
|
+
position: relative;
|
|
56
|
+
width: 100%;
|
|
57
|
+
height: 100%;
|
|
58
|
+
display: grid;
|
|
59
|
+
place-items: center;
|
|
60
|
+
background: {sceneBg};
|
|
61
|
+
font-family: {font};
|
|
62
|
+
overflow: hidden;
|
|
63
|
+
}
|
|
64
|
+
.stack {
|
|
65
|
+
display: flex;
|
|
66
|
+
flex-direction: column;
|
|
67
|
+
align-items: center;
|
|
68
|
+
gap: STACK_GAP;
|
|
69
|
+
}
|
|
70
|
+
.btn {
|
|
71
|
+
display: flex;
|
|
72
|
+
align-items: center;
|
|
73
|
+
gap: BTN_INNER_GAP;
|
|
74
|
+
padding: BTN_PADDING_V BTN_PADDING_H;
|
|
75
|
+
background: {btnBg};
|
|
76
|
+
border: none;
|
|
77
|
+
border-radius: BTN_RADIUS;
|
|
78
|
+
color: {btnTextColor};
|
|
79
|
+
font-family: {font};
|
|
80
|
+
font-weight: 900;
|
|
81
|
+
font-size: BTN_FONT_SIZE;
|
|
82
|
+
letter-spacing: BTN_TRACKING;
|
|
83
|
+
text-transform: uppercase;
|
|
84
|
+
cursor: pointer;
|
|
85
|
+
box-shadow: {btnRestingShadow};
|
|
86
|
+
transform-origin: 50% 50%;
|
|
87
|
+
will-change: transform;
|
|
88
|
+
}
|
|
89
|
+
.btn-icon {
|
|
90
|
+
font-size: BTN_ICON_SIZE;
|
|
91
|
+
line-height: 1;
|
|
92
|
+
}
|
|
93
|
+
.brand {
|
|
94
|
+
font-size: BRAND_SIZE;
|
|
95
|
+
font-weight: 800;
|
|
96
|
+
letter-spacing: BRAND_TRACKING;
|
|
97
|
+
color: {brandColor};
|
|
98
|
+
text-transform: uppercase;
|
|
99
|
+
}
|
|
100
|
+
/* Cursor — absolute, positioned by GSAP */
|
|
101
|
+
.cursor {
|
|
102
|
+
position: absolute;
|
|
103
|
+
width: CURSOR_SIZE;
|
|
104
|
+
height: CURSOR_SIZE;
|
|
105
|
+
pointer-events: none;
|
|
106
|
+
z-index: 100;
|
|
107
|
+
/* initial position is set by gsap.set() */
|
|
108
|
+
transform-origin: 0 0; /* arrow point is the click point */
|
|
109
|
+
filter: {cursorDropShadow};
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## GSAP Timeline
|
|
114
|
+
|
|
115
|
+
```html
|
|
116
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
|
117
|
+
<script>
|
|
118
|
+
window.__timelines = window.__timelines || {};
|
|
119
|
+
const tl = gsap.timeline({ paused: true });
|
|
120
|
+
|
|
121
|
+
// Position cursor initially off-target (off-screen or far corner).
|
|
122
|
+
gsap.set("#cursor", { x: CURSOR_START_X, y: CURSOR_START_Y });
|
|
123
|
+
|
|
124
|
+
// The button's screen center, in composition coordinates.
|
|
125
|
+
const BUTTON_CENTER = { x: BUTTON_CENTER_X, y: BUTTON_CENTER_Y };
|
|
126
|
+
|
|
127
|
+
// Phase 1 — cursor approaches button
|
|
128
|
+
tl.to(
|
|
129
|
+
"#cursor",
|
|
130
|
+
{
|
|
131
|
+
x: BUTTON_CENTER.x,
|
|
132
|
+
y: BUTTON_CENTER.y,
|
|
133
|
+
duration: APPROACH_DUR,
|
|
134
|
+
ease: "power2.inOut",
|
|
135
|
+
},
|
|
136
|
+
APPROACH_START,
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
// Phase 2 — coordinated press down (button + cursor both scale to 1 - PRESS_INTENSITY)
|
|
140
|
+
tl.to(
|
|
141
|
+
["#btn", "#cursor"],
|
|
142
|
+
{
|
|
143
|
+
scale: 1 - PRESS_INTENSITY,
|
|
144
|
+
duration: PRESS_DOWN_DUR,
|
|
145
|
+
ease: "power1.in",
|
|
146
|
+
},
|
|
147
|
+
PRESS_DOWN_AT,
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
// Phase 3 — release (both spring back to 1.0 with overshoot)
|
|
151
|
+
tl.to(
|
|
152
|
+
["#btn", "#cursor"],
|
|
153
|
+
{
|
|
154
|
+
scale: 1,
|
|
155
|
+
duration: RELEASE_DUR,
|
|
156
|
+
ease: `back.out(${BOUNCE_FACTOR})`,
|
|
157
|
+
},
|
|
158
|
+
RELEASE_AT,
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
// Phase 4 — inner glow during press (boxShadow change synced to press scale)
|
|
162
|
+
tl.to(
|
|
163
|
+
"#btn",
|
|
164
|
+
{
|
|
165
|
+
boxShadow: `{btnPressedShadow}`,
|
|
166
|
+
duration: PRESS_DOWN_DUR,
|
|
167
|
+
ease: "power1.in",
|
|
168
|
+
},
|
|
169
|
+
PRESS_DOWN_AT,
|
|
170
|
+
);
|
|
171
|
+
tl.to(
|
|
172
|
+
"#btn",
|
|
173
|
+
{
|
|
174
|
+
boxShadow: `{btnRestingShadow}`,
|
|
175
|
+
duration: RELEASE_DUR,
|
|
176
|
+
ease: "power2.out",
|
|
177
|
+
},
|
|
178
|
+
RELEASE_AT,
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
// Brand fades in early (context)
|
|
182
|
+
tl.from(
|
|
183
|
+
".brand",
|
|
184
|
+
{ opacity: 0, y: BRAND_REVEAL_Y_PX, duration: BRAND_REVEAL_DUR, ease: "power3.out" },
|
|
185
|
+
BRAND_REVEAL_AT,
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
// Cursor optionally moves off after press (or holds for dwell)
|
|
189
|
+
tl.to(
|
|
190
|
+
"#cursor",
|
|
191
|
+
{ x: CURSOR_EXIT_X, y: CURSOR_EXIT_Y, duration: CURSOR_EXIT_DUR, ease: "power2.out" },
|
|
192
|
+
CURSOR_EXIT_AT,
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
window.__timelines["press-react-scene"] = tl;
|
|
196
|
+
</script>
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Variations
|
|
200
|
+
|
|
201
|
+
### Multiple-element chain press
|
|
202
|
+
|
|
203
|
+
Cursor presses button A → button A triggers swap → cursor moves to button B → presses again. Each press is one full down-release sub-routine.
|
|
204
|
+
|
|
205
|
+
### Hold press (continuous pressure)
|
|
206
|
+
|
|
207
|
+
Insert a `HOLD_DUR` window between press-down and release. Cursor scale stays at `1 - PRESS_INTENSITY`, button scale stays at `1 - PRESS_INTENSITY`, inner glow stays on. Suggests "thinking" or "loading."
|
|
208
|
+
|
|
209
|
+
### Synchronized inner-glow pulse
|
|
210
|
+
|
|
211
|
+
During the hold phase, the inner glow pulses (sin-driven). Suggests "processing":
|
|
212
|
+
|
|
213
|
+
```js
|
|
214
|
+
const holdGlow = { p: 0 };
|
|
215
|
+
tl.to(
|
|
216
|
+
holdGlow,
|
|
217
|
+
{
|
|
218
|
+
p: Math.PI * GLOW_PULSE_CYCLES * 2,
|
|
219
|
+
duration: HOLD_DUR,
|
|
220
|
+
ease: "none",
|
|
221
|
+
onUpdate: () => {
|
|
222
|
+
const alpha = GLOW_BASE_ALPHA + Math.sin(holdGlow.p) * GLOW_PULSE_AMP;
|
|
223
|
+
document.getElementById("btn").style.boxShadow =
|
|
224
|
+
`inset 0 0 GLOW_BLUR rgba(255, 255, 255, ${alpha})`;
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
HOLD_START_AT,
|
|
228
|
+
);
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## How to Choose Values
|
|
232
|
+
|
|
233
|
+
### Timing (seconds)
|
|
234
|
+
|
|
235
|
+
- **APPROACH_START** — when the cursor begins moving toward the button.
|
|
236
|
+
- Range: 0-0.3 s (small lead-in is fine; long delays read as a dead frame)
|
|
237
|
+
- **APPROACH_DUR** — cursor approach duration.
|
|
238
|
+
- Range: 0.7-1.3 s; faster reads as urgent, slower as deliberate
|
|
239
|
+
- **PRESS_DOWN_AT** — when the press fires.
|
|
240
|
+
- Constraints: MUST equal `APPROACH_START + APPROACH_DUR` so the cursor arrives exactly when the press begins (avoids "tapping on air")
|
|
241
|
+
- **PRESS_DOWN_DUR** — compression duration.
|
|
242
|
+
- Range: 0.1-0.25 s
|
|
243
|
+
- **RELEASE_AT** — when the release fires.
|
|
244
|
+
- Constraints: must be > `PRESS_DOWN_AT + PRESS_DOWN_DUR`; an optional brief hold (0.05-0.4 s, or `HOLD_DUR` for the Hold-press variation) for "thinking" interactions
|
|
245
|
+
- **RELEASE_DUR** — release spring duration.
|
|
246
|
+
- Range: 0.4-0.7 s (long enough for the overshoot to settle)
|
|
247
|
+
- **BRAND_REVEAL_AT** — when the brand line fades in.
|
|
248
|
+
- Constraints: must be < `PRESS_DOWN_AT` (context precedes interaction)
|
|
249
|
+
- **BRAND_REVEAL_DUR** — brand fade-in duration.
|
|
250
|
+
- Range: 0.4-0.8 s
|
|
251
|
+
- **CURSOR_EXIT_AT / CURSOR_EXIT_DUR** — optional outbound cursor motion after release.
|
|
252
|
+
- Constraints: `CURSOR_EXIT_AT` must be ≥ `RELEASE_AT + RELEASE_DUR` so the cursor exits AFTER the press settles, not during
|
|
253
|
+
|
|
254
|
+
### Physics
|
|
255
|
+
|
|
256
|
+
- **PRESS_INTENSITY** — how deep the press compression goes.
|
|
257
|
+
- Range: 0.05 (subtle) - 0.10 (standard) - 0.15 (heavy)
|
|
258
|
+
- Applied as `scale: 1 - PRESS_INTENSITY` on both cursor and button (single GSAP target array)
|
|
259
|
+
- **BOUNCE_FACTOR** — `back.out(${BOUNCE_FACTOR})` overshoot on the release.
|
|
260
|
+
- Range: 1.6 (soft) - 2.0 (firm) - 2.4 (cartoony)
|
|
261
|
+
|
|
262
|
+
### Positioning
|
|
263
|
+
|
|
264
|
+
- **CURSOR_START_X / CURSOR_START_Y** — initial cursor position in composition coordinates.
|
|
265
|
+
- Constraints: off-screen or in a corner far from the button so the approach reads as motion-in, not a teleport
|
|
266
|
+
- **BUTTON_CENTER_X / BUTTON_CENTER_Y** — the button's measured screen-space center.
|
|
267
|
+
- Source: measured at composition coordinates; for `place-items: center` at 1920×1080 this is `(960, 540)`
|
|
268
|
+
- **CURSOR_EXIT_X / CURSOR_EXIT_Y** — where the cursor moves after release (if used).
|
|
269
|
+
- Range: any off-stage or out-of-the-way position
|
|
270
|
+
- **BRAND_REVEAL_Y_PX** — brand initial y offset.
|
|
271
|
+
- Range: 8-20 px
|
|
272
|
+
|
|
273
|
+
### Layout / typography
|
|
274
|
+
|
|
275
|
+
- **STACK_GAP** — gap between button and brand line.
|
|
276
|
+
- Range: 40-96 px
|
|
277
|
+
- **BTN_PADDING_V / BTN_PADDING_H** — button padding.
|
|
278
|
+
- Range: V 24-40 px, H 60-100 px (horizontal padding 2-3× vertical reads as pill-shaped CTA)
|
|
279
|
+
- **BTN_INNER_GAP** — gap between icon and label inside the button.
|
|
280
|
+
- Range: 16-32 px
|
|
281
|
+
- **BTN_RADIUS** — button corner radius.
|
|
282
|
+
- Range: 20-40 px, or `BTN_PADDING_V + BTN_FONT_SIZE/2` for fully rounded ends
|
|
283
|
+
- **BTN_FONT_SIZE / BTN_ICON_SIZE** — typographic sizes inside the button.
|
|
284
|
+
- Range: font 60-100 px at 1080p; icon ~1.0-1.1× font size
|
|
285
|
+
- **BTN_TRACKING** — letter-spacing on uppercase button text.
|
|
286
|
+
- Range: 4-12 px
|
|
287
|
+
- **BRAND_SIZE / BRAND_TRACKING** — brand line typography.
|
|
288
|
+
- Range: 40-60 px, tracking 8-16 px
|
|
289
|
+
- **CURSOR_SIZE** — cursor SVG size.
|
|
290
|
+
- Range: 48-96 px at 1080p
|
|
291
|
+
|
|
292
|
+
### Hold-press variation
|
|
293
|
+
|
|
294
|
+
- **HOLD_DUR** — hold window between press down and release.
|
|
295
|
+
- Range: 0.3-0.8 s
|
|
296
|
+
- **HOLD_START_AT** — when the glow pulse begins.
|
|
297
|
+
- Constraints: typically equal to `PRESS_DOWN_AT + PRESS_DOWN_DUR`
|
|
298
|
+
- **GLOW_PULSE_CYCLES** — number of full sine cycles across `HOLD_DUR`.
|
|
299
|
+
- Range: 1-4 (more cycles read as faster "processing")
|
|
300
|
+
- **GLOW_BASE_ALPHA** — center of the alpha pulse.
|
|
301
|
+
- Range: 0.15-0.3
|
|
302
|
+
- **GLOW_PULSE_AMP** — peak deviation from `GLOW_BASE_ALPHA`.
|
|
303
|
+
- Range: 0.1-0.2; must satisfy `GLOW_BASE_ALPHA - GLOW_PULSE_AMP ≥ 0`
|
|
304
|
+
- **GLOW_BLUR** — inset glow blur radius (px).
|
|
305
|
+
- Range: 24-48 px
|
|
306
|
+
|
|
307
|
+
### Tokens
|
|
308
|
+
|
|
309
|
+
- **{sceneBg}** — background gradient/color
|
|
310
|
+
- **{font}** — typographic stack
|
|
311
|
+
- **{btnBg}** — button background (typically gradient toward an accent hue)
|
|
312
|
+
- **{btnTextColor}** — button text color
|
|
313
|
+
- **{btnRestingShadow}** / **{btnPressedShadow}** — outer + inset box-shadow strings for the resting and pressed states
|
|
314
|
+
- **{brandColor}** — accent brand color
|
|
315
|
+
- **{cursorFill}** / **{cursorStroke}** — cursor SVG fill and stroke
|
|
316
|
+
- **{cursorDropShadow}** — `filter: drop-shadow(...)` value for cursor depth
|
|
317
|
+
- **{Brand}** — brand line copy
|
|
318
|
+
- **{ctaCopy}** / **{ctaIcon}** — button label and inline icon glyph
|
|
319
|
+
|
|
320
|
+
## Key Principles
|
|
321
|
+
|
|
322
|
+
- **Same press scale on cursor AND button** — physical synchronicity. If only the button scales, the cursor appears to "tap on air"; if only the cursor scales, the button feels disconnected.
|
|
323
|
+
- **Cursor arrives BEFORE press starts** — there must be a clear moment of "cursor over target" before scale change. Otherwise the press is unattributed.
|
|
324
|
+
- **`back.out(${BOUNCE_FACTOR})` for release** — both elements need spring overshoot together. Linear release loses the tactile feel.
|
|
325
|
+
- **Inner glow appears DURING press, fades on release** — visual confirmation of contact. Outer shadow shrinks (pushed-in), inner glow appears (energy concentrated).
|
|
326
|
+
- **Cursor `pointer-events: none`** — the cursor is decorative; if it captures events, hover/click behaviors on button below break.
|
|
327
|
+
- **Cursor `transform-origin: 0 0`** — the arrow's tip is the click point, not its center. Scale around the tip keeps the click point stable.
|
|
328
|
+
- **Climax dwell ≥1 s** — after release, the comp must continue ≥1 s. The press is a beat; viewer needs time to see the result.
|
|
329
|
+
|
|
330
|
+
## Critical Constraints
|
|
331
|
+
|
|
332
|
+
- **Timeline must be paused**: `gsap.timeline({ paused: true })`
|
|
333
|
+
- **Registry key = `data-composition-id`**
|
|
334
|
+
- **No CSS `transition`** on either cursor or button — competes with GSAP
|
|
335
|
+
- **Cursor SVG with `pointer-events: none`**
|
|
336
|
+
- **`will-change: transform`** on button (and cursor if desired)
|
|
337
|
+
- **`up-frame > down-frame`** — release MUST come after press; otherwise the comp shows release without press
|
|
338
|
+
- **Don't use real `mouseenter` / `click` events** — HF is a render context, not a UI; everything must run via the timeline
|
|
339
|
+
|
|
340
|
+
## Combinations
|
|
341
|
+
|
|
342
|
+
- [press-release-spring.md](press-release-spring.md) — the BUTTON-only press variant; this rule layers cursor on top
|
|
343
|
+
- [cursor-click-ripple.md](cursor-click-ripple.md) — adds a ripple effect at the click point
|
|
344
|
+
- [scale-swap-transition.md](scale-swap-transition.md) — the press TRIGGERS the swap
|
|
345
|
+
|
|
346
|
+
## Pairs with HF skills
|
|
347
|
+
|
|
348
|
+
- `/hyperframes-animation` — coordinated multi-target tweens via array
|
|
349
|
+
- `/hyperframes-core` — composition wiring
|
|
350
|
+
- `/hyperframes-cli` — `hyperframes lint`
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: press-release-spring
|
|
3
|
+
description: Tactile button press with linear compression, spring-based elastic recovery, and layered visual feedback (shadow shrink + release burst + background glow).
|
|
4
|
+
metadata:
|
|
5
|
+
tags: spring, press, interaction, button, physics, glow, burst, ui
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Press-Release Spring Chain
|
|
9
|
+
|
|
10
|
+
Separates input (linear compression) from output (spring recovery) to create tactile feel. The overshoot is a natural byproduct of the spring config, not manually coded. Pairs with secondary motion (shadow shrink, release burst, background glow) layered on the same trigger frame.
|
|
11
|
+
|
|
12
|
+
## How It Works
|
|
13
|
+
|
|
14
|
+
Two distinct phases split at the **release** moment:
|
|
15
|
+
|
|
16
|
+
1. **Press**: linear ease → compression (`scale: 1 → PRESS_SCALE`, shadow shrinks). Linear, not spring — the dip must read as instant/tactile, not squishy.
|
|
17
|
+
2. **Release**: `back.out(${BOUNCE_FACTOR})` spring → elastic pop back to `1.0` (overshoot proportional to `BOUNCE_FACTOR`). Optional burst glow ring expands behind the button; optional background environmental glow fades in.
|
|
18
|
+
|
|
19
|
+
State continuity is critical: the release tween's start value MUST equal the press tween's end value, or the spring snaps to a different position. GSAP threads this automatically when both tweens target the same property at adjacent positions on the same timeline.
|
|
20
|
+
|
|
21
|
+
## HTML
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<div
|
|
25
|
+
class="scene"
|
|
26
|
+
id="press-scene"
|
|
27
|
+
data-composition-id="press-scene"
|
|
28
|
+
data-start="0"
|
|
29
|
+
data-duration="DURATION"
|
|
30
|
+
data-track-index="0"
|
|
31
|
+
>
|
|
32
|
+
<div class="press-stage">
|
|
33
|
+
<div class="bg-glow" id="bg-glow"></div>
|
|
34
|
+
<div class="burst" id="burst"></div>
|
|
35
|
+
<button class="btn" id="btn">{buttonLabel}</button>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## CSS
|
|
41
|
+
|
|
42
|
+
```css
|
|
43
|
+
.scene {
|
|
44
|
+
position: relative;
|
|
45
|
+
width: 100%;
|
|
46
|
+
height: 100%;
|
|
47
|
+
display: grid;
|
|
48
|
+
place-items: center;
|
|
49
|
+
background: {bgColor};
|
|
50
|
+
}
|
|
51
|
+
.press-stage {
|
|
52
|
+
position: relative;
|
|
53
|
+
display: grid;
|
|
54
|
+
place-items: center;
|
|
55
|
+
}
|
|
56
|
+
.btn {
|
|
57
|
+
position: relative;
|
|
58
|
+
z-index: 2;
|
|
59
|
+
/* Visual weight: ≥4% of canvas for the press to read on a 1080p frame */
|
|
60
|
+
width: BTN_WIDTH;
|
|
61
|
+
height: BTN_HEIGHT;
|
|
62
|
+
background: {btnBg};
|
|
63
|
+
border: none;
|
|
64
|
+
border-radius: BTN_RADIUS;
|
|
65
|
+
font-family: {font};
|
|
66
|
+
font-weight: 900;
|
|
67
|
+
font-size: BTN_FONT_SIZE;
|
|
68
|
+
letter-spacing: BTN_LETTER_SPACING;
|
|
69
|
+
color: {btnTextColor};
|
|
70
|
+
text-transform: uppercase;
|
|
71
|
+
/* Anchor compression on the center — see Critical Constraints */
|
|
72
|
+
transform-origin: 50% 50%;
|
|
73
|
+
/* Initial floating shadow — large + diffuse */
|
|
74
|
+
box-shadow: {btnRestShadow};
|
|
75
|
+
}
|
|
76
|
+
.burst {
|
|
77
|
+
/* Sits BEHIND the button, same footprint */
|
|
78
|
+
position: absolute;
|
|
79
|
+
z-index: 1;
|
|
80
|
+
inset: 0;
|
|
81
|
+
width: BTN_WIDTH;
|
|
82
|
+
height: BTN_HEIGHT;
|
|
83
|
+
background: {burstGradient};
|
|
84
|
+
filter: blur(BURST_BLUR);
|
|
85
|
+
opacity: 0;
|
|
86
|
+
transform: scale(1);
|
|
87
|
+
pointer-events: none;
|
|
88
|
+
}
|
|
89
|
+
.bg-glow {
|
|
90
|
+
/* Full-stage radial — extends beyond the stage with negative inset */
|
|
91
|
+
position: absolute;
|
|
92
|
+
inset: BG_GLOW_INSET;
|
|
93
|
+
background: {bgGlowGradient};
|
|
94
|
+
opacity: 0;
|
|
95
|
+
pointer-events: none;
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## GSAP Timeline
|
|
100
|
+
|
|
101
|
+
```html
|
|
102
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
|
103
|
+
<script>
|
|
104
|
+
window.__timelines = window.__timelines || {};
|
|
105
|
+
const tl = gsap.timeline({ paused: true });
|
|
106
|
+
|
|
107
|
+
// Phase 1 — press (linear compression)
|
|
108
|
+
tl.to(
|
|
109
|
+
"#btn",
|
|
110
|
+
{
|
|
111
|
+
scale: PRESS_SCALE,
|
|
112
|
+
boxShadow: "{btnPressedShadow}",
|
|
113
|
+
duration: PRESS_DUR,
|
|
114
|
+
ease: "power1.in",
|
|
115
|
+
},
|
|
116
|
+
PRESS_START,
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
// Phase 2 — release (spring back with overshoot)
|
|
120
|
+
// CRITICAL: start scale == end of phase 1 (PRESS_SCALE) to maintain state continuity.
|
|
121
|
+
tl.to(
|
|
122
|
+
"#btn",
|
|
123
|
+
{
|
|
124
|
+
scale: 1,
|
|
125
|
+
boxShadow: "{btnRestShadow}",
|
|
126
|
+
duration: RELEASE_DUR,
|
|
127
|
+
ease: `back.out(${BOUNCE_FACTOR})`,
|
|
128
|
+
},
|
|
129
|
+
RELEASE_START,
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
// Phase 3 — burst glow (radial pop behind button), triggered with release
|
|
133
|
+
tl.fromTo(
|
|
134
|
+
"#burst",
|
|
135
|
+
{ scale: 1, opacity: 0 },
|
|
136
|
+
{
|
|
137
|
+
scale: BURST_PEAK_SCALE,
|
|
138
|
+
opacity: BURST_PEAK_OPACITY,
|
|
139
|
+
duration: BURST_GROW_DUR,
|
|
140
|
+
ease: "power2.out",
|
|
141
|
+
},
|
|
142
|
+
RELEASE_START,
|
|
143
|
+
);
|
|
144
|
+
// Burst then fades out
|
|
145
|
+
tl.to("#burst", { opacity: 0, duration: BURST_FADE_DUR, ease: "power2.in" }, BURST_FADE_START);
|
|
146
|
+
|
|
147
|
+
// Phase 4 — background environmental glow fades in after release
|
|
148
|
+
tl.to(
|
|
149
|
+
"#bg-glow",
|
|
150
|
+
{
|
|
151
|
+
opacity: BG_GLOW_PEAK_OPACITY,
|
|
152
|
+
duration: BG_GLOW_FADE_DUR,
|
|
153
|
+
ease: "power2.out",
|
|
154
|
+
},
|
|
155
|
+
RELEASE_START,
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
window.__timelines["press-scene"] = tl;
|
|
159
|
+
</script>
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Variations
|
|
163
|
+
|
|
164
|
+
### Subtle press (status save / muted CTA)
|
|
165
|
+
|
|
166
|
+
Less compression, gentler overshoot, smaller burst. `PRESS_SCALE` toward the high end of its range (~0.96), `BOUNCE_FACTOR` toward the low end (~1.4), `BURST_PEAK_SCALE` and `BURST_PEAK_OPACITY` reduced.
|
|
167
|
+
|
|
168
|
+
### Dramatic press (hero CTA / "ship it" moment)
|
|
169
|
+
|
|
170
|
+
Deeper compression, more overshoot, larger burst. `PRESS_SCALE` toward the low end (~0.88), `BOUNCE_FACTOR` toward the high end (~2.5), `BURST_PEAK_SCALE` and `BURST_PEAK_OPACITY` maxed.
|
|
171
|
+
|
|
172
|
+
### Color shift during press
|
|
173
|
+
|
|
174
|
+
Darken the button mid-press, return on release. Same timeline positions as the scale tweens — interpolated `backgroundColor` on `#btn`. State continuity rule still applies: the release-color tween's start equals the press-color tween's end.
|
|
175
|
+
|
|
176
|
+
```js
|
|
177
|
+
tl.to("#btn", { backgroundColor: "{btnPressedColor}", duration: PRESS_DUR }, PRESS_START);
|
|
178
|
+
tl.to("#btn", { backgroundColor: "{btnRestColor}", duration: RELEASE_DUR }, RELEASE_START);
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### State change at release (approve / confirm pattern)
|
|
182
|
+
|
|
183
|
+
When the press signals confirmation, swap the button's resting color to a success token at `RELEASE_START` (instead of returning to `{btnRestColor}`), then pop a checkmark via a separate `back.out(${CHECK_BOUNCE})` tween at the same position. The button is now in its terminal state — no further presses expected.
|
|
184
|
+
|
|
185
|
+
```js
|
|
186
|
+
tl.to("#btn", { backgroundColor: "{successColor}", duration: RELEASE_DUR }, RELEASE_START);
|
|
187
|
+
tl.to(
|
|
188
|
+
".btn-check",
|
|
189
|
+
{ scale: 1, duration: CHECK_POP_DUR, ease: `back.out(${CHECK_BOUNCE})` },
|
|
190
|
+
RELEASE_START,
|
|
191
|
+
);
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## How to Choose Values
|
|
195
|
+
|
|
196
|
+
### Geometry
|
|
197
|
+
|
|
198
|
+
- **BTN_WIDTH / BTN_HEIGHT** — button footprint.
|
|
199
|
+
- Range: button area ≥ 3-5% of canvas (a 320×68 button at 1080p is ~1% and reads as visually insignificant)
|
|
200
|
+
- Effects: smaller → press barely reads; larger → press dominates the frame
|
|
201
|
+
- Constraints: `BTN_WIDTH × BTN_HEIGHT / (canvasW × canvasH) ≥ 0.03`
|
|
202
|
+
- **BTN_RADIUS** — corner radius.
|
|
203
|
+
- Range: `BTN_HEIGHT × 0.15` (sharp/modern) → `BTN_HEIGHT / 2` (pill)
|
|
204
|
+
- **BTN_FONT_SIZE / BTN_LETTER_SPACING** — typographic weight.
|
|
205
|
+
- Range: `BTN_FONT_SIZE ≈ BTN_HEIGHT × 0.4-0.5`; letter-spacing 4-10 px reads as "actionable label"
|
|
206
|
+
|
|
207
|
+
### Press dynamics
|
|
208
|
+
|
|
209
|
+
- **PRESS_SCALE** — compression depth.
|
|
210
|
+
- Range: 0.88 (dramatic) → 0.92 (default) → 0.96 (subtle)
|
|
211
|
+
- Effects: lower → more tactile / weightier; higher → barely-there acknowledgment
|
|
212
|
+
- Constraints: never <0.85 (button feels broken) or >0.98 (no perceptible dip)
|
|
213
|
+
- **PRESS_DUR** — compression duration.
|
|
214
|
+
- Range: 0.10-0.30 s
|
|
215
|
+
- Effects: shorter → snappier / "instant-feeling"; longer → slow squish
|
|
216
|
+
- Constraints: shorter than `RELEASE_DUR` (input is faster than spring recovery)
|
|
217
|
+
- **RELEASE_DUR** — spring recovery duration.
|
|
218
|
+
- Range: 0.40-0.90 s
|
|
219
|
+
- Effects: shorter → tight pop; longer → loose, wobbly settle
|
|
220
|
+
- **BOUNCE_FACTOR** — `back.out(BOUNCE_FACTOR)` overshoot strength.
|
|
221
|
+
- Range: 1.4 (soft) → 2.0 (firm pop) → 2.8 (cartoony)
|
|
222
|
+
- Effects: low end barely overshoots; high end reads as cartoonish; tune by feel
|
|
223
|
+
- Alternative: switch to `elastic.out(amplitude, period)` for a rubbery oscillation instead of a single overshoot
|
|
224
|
+
- **PRESS_START / RELEASE_START** — timeline positions.
|
|
225
|
+
- Constraints: `RELEASE_START = PRESS_START + PRESS_DUR` (state continuity — see Critical Constraints)
|
|
226
|
+
|
|
227
|
+
### Burst glow
|
|
228
|
+
|
|
229
|
+
- **BURST_PEAK_SCALE** — radial pop max scale.
|
|
230
|
+
- Range: 3 (subtle) → 6 (default) → 8 (dramatic)
|
|
231
|
+
- Constraints: ≤ ~8 — beyond that the radial gradient pixelates visibly
|
|
232
|
+
- **BURST_PEAK_OPACITY** — burst max opacity.
|
|
233
|
+
- Range: 0.4 (subtle) → 0.8 (default) → 1.0 (dramatic)
|
|
234
|
+
- **BURST_GROW_DUR / BURST_FADE_DUR** — grow vs. fade timing.
|
|
235
|
+
- Range: 0.4-0.7 s each; default grow ≈ fade
|
|
236
|
+
- **BURST_BLUR** — gaussian blur on the burst layer.
|
|
237
|
+
- Range: 40-100 px; smaller reads as a hard ring, larger as ambient haze
|
|
238
|
+
|
|
239
|
+
### Background glow
|
|
240
|
+
|
|
241
|
+
- **BG_GLOW_PEAK_OPACITY** — peak environmental glow.
|
|
242
|
+
- Range: 0.1 (subtle) → 0.25 (default) → 0.45 (dramatic)
|
|
243
|
+
- Constraints: ≤ 0.45 — higher washes the whole composition
|
|
244
|
+
- **BG_GLOW_FADE_DUR** — fade-in duration.
|
|
245
|
+
- Range: 0.6-1.0 s
|
|
246
|
+
- **BG_GLOW_INSET** — negative inset so the radial extends past the stage edges.
|
|
247
|
+
- Range: typically `-300` to `-500` px on a 1920×1080 canvas
|
|
248
|
+
|
|
249
|
+
### Optional "approve" variation
|
|
250
|
+
|
|
251
|
+
- **CHECK_BOUNCE** — checkmark pop overshoot.
|
|
252
|
+
- Range: 1.4-2.0; firmer than the button's main `BOUNCE_FACTOR` to read as a punctuating "stamp"
|
|
253
|
+
- **CHECK_POP_DUR** — checkmark scale-up duration.
|
|
254
|
+
- Range: 0.3-0.6 s
|
|
255
|
+
|
|
256
|
+
### Tokens
|
|
257
|
+
|
|
258
|
+
- **{btnBg} / {btnRestColor} / {btnPressedColor}** — primary button surface; pressed darker than rest
|
|
259
|
+
- **{btnRestShadow} / {btnPressedShadow}** — rest shadow is large + diffuse; pressed is small + tight (the button "sinks toward the surface")
|
|
260
|
+
- **{burstGradient}** — radial; saturated near center, fading to transparent (color should be darker + more saturated than `{btnBg}` — same-color glow looks washed out)
|
|
261
|
+
- **{bgGlowGradient}** — full-stage radial, low-opacity tint of `{btnBg}`'s hue family
|
|
262
|
+
- **{successColor}** — confirmation green / brand-success for the approve variation
|
|
263
|
+
|
|
264
|
+
## Key Principles
|
|
265
|
+
|
|
266
|
+
- **State continuity** — release start value MUST exactly match press end value. With a GSAP timeline, the first tween's end value automatically becomes the second tween's start when they target the same property at adjacent times.
|
|
267
|
+
- **Visual weight** — button area should be **≥3-5% of canvas**. Smaller and the press reads as visually insignificant.
|
|
268
|
+
- **Linear press, spring release** — the compression is `power1.in/out`, the recovery is `back.out`. Both spring → squishy; both linear → mechanical / no overshoot punch.
|
|
269
|
+
- **Anchor compression on center** — `transform-origin: 50% 50%` (default). Otherwise the button collapses asymmetrically.
|
|
270
|
+
- **Burst behind, not in front** — burst `z-index: 1`, button `z-index: 2`. If burst sits in front, it occludes the button at peak opacity.
|
|
271
|
+
- **Glow color darker + more saturated than element** — bright surface → dark, saturated glow. Same-color glow looks washed out.
|
|
272
|
+
- **Don't tween `boxShadow` and `filter` together on the same element** — they compete in the layout pipeline; pick one. Shadow on the button, blur on a separate burst layer.
|
|
273
|
+
- **Climax beats need dwell time** — after the burst peak + label/wordmark reveal, the composition must run for **≥1s more** (≥2s for "dramatic" variants) before ending. A reveal at `t=DURATION−0.2s` reads as "flashed and gone."
|
|
274
|
+
|
|
275
|
+
## Critical Constraints
|
|
276
|
+
|
|
277
|
+
- **Timeline must be paused**: `gsap.timeline({ paused: true })`
|
|
278
|
+
- **Registry key = `data-composition-id`**
|
|
279
|
+
- **No CSS `transition`** on the button — those interpolate independently of HF seek and cause flicker
|
|
280
|
+
- **`will-change: transform`** if the button compounds with other animation layers
|
|
281
|
+
- **`RELEASE_START = PRESS_START + PRESS_DUR`** — adjacency on the same property is what makes state continuity automatic; gap or overlap breaks it
|
|
282
|
+
- **Burst max scale ≤ ~8** — beyond that the radial gradient pixelates visibly
|
|
283
|
+
- **Background glow `opacity ≤ 0.45`** — higher and it washes the whole composition
|
|
284
|
+
- **GSAP transform aliases only**: `x`, `y`, `scale`, `rotation`. Never tween `width` / `height` / `left` / `top`.
|
|
285
|
+
|
|
286
|
+
## Combinations
|
|
287
|
+
|
|
288
|
+
- [sine-wave-loop.md](sine-wave-loop.md) — idle micro-float on the button BEFORE the press (slight breathing, sells "ready")
|
|
289
|
+
- [center-outward-expansion.md](center-outward-expansion.md) — burst of badges outward synced to the press release
|
|
290
|
+
- [cursor-click-ripple.md](cursor-click-ripple.md) — cursor click that triggers the press
|
|
291
|
+
|
|
292
|
+
## Pairs with HF skills
|
|
293
|
+
|
|
294
|
+
- `/hyperframes-animation` — `back.out` ease + multi-tween coordination
|
|
295
|
+
- `/hyperframes-core` — composition wiring
|
|
296
|
+
- `/hyperframes-cli` — `hyperframes lint`
|