@mevdragon/vidfarm-devcli 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/embedded-captions/CATALOG.md +93 -0
- package/.agents/skills/embedded-captions/SKILL.md +286 -0
- package/.agents/skills/embedded-captions/assets/brand/CDPR-fankit-terms.txt +35 -0
- package/.agents/skills/embedded-captions/assets/brand/cyberpunk-widths.json +115 -0
- package/.agents/skills/embedded-captions/assets/fonts/char-widths.json +2211 -0
- package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +242 -0
- package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +242 -0
- package/.agents/skills/embedded-captions/dna/README.md +148 -0
- package/.agents/skills/embedded-captions/dna/chrome.json +68 -0
- package/.agents/skills/embedded-captions/dna/cream.json +69 -0
- package/.agents/skills/embedded-captions/dna/documentary.json +62 -0
- package/.agents/skills/embedded-captions/dna/editorial.json +70 -0
- package/.agents/skills/embedded-captions/dna/glitch.json +82 -0
- package/.agents/skills/embedded-captions/dna/ink.json +65 -0
- package/.agents/skills/embedded-captions/dna/keynote.json +62 -0
- package/.agents/skills/embedded-captions/dna/loud.json +75 -0
- package/.agents/skills/embedded-captions/dna/neon.json +58 -0
- package/.agents/skills/embedded-captions/dna/velocity.json +89 -0
- package/.agents/skills/embedded-captions/modes/cinematic/README.md +48 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +98 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +188 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +134 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +179 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +81 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +170 -0
- package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +16 -0
- package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +226 -0
- package/.agents/skills/embedded-captions/modes/cinematic/engine.html +355 -0
- package/.agents/skills/embedded-captions/modes/standard/_anatomy.md +233 -0
- package/.agents/skills/embedded-captions/modes/standard/_motion.md +192 -0
- package/.agents/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs +97 -0
- package/.agents/skills/embedded-captions/references/aesthetic-principles.md +168 -0
- package/.agents/skills/embedded-captions/references/anti-patterns.md +188 -0
- package/.agents/skills/embedded-captions/references/bespoke-vs-presets.md +178 -0
- package/.agents/skills/embedded-captions/references/caption-grouping.md +130 -0
- package/.agents/skills/embedded-captions/references/composition-craft.md +522 -0
- package/.agents/skills/embedded-captions/references/direction-catalog.md +138 -0
- package/.agents/skills/embedded-captions/references/example-renders/champion.html +371 -0
- package/.agents/skills/embedded-captions/references/example-renders/memory-wall.html +334 -0
- package/.agents/skills/embedded-captions/references/failure-modes.md +145 -0
- package/.agents/skills/embedded-captions/references/layout-heuristics.md +238 -0
- package/.agents/skills/embedded-captions/references/motion-vocabulary.md +148 -0
- package/.agents/skills/embedded-captions/references/rail.md +68 -0
- package/.agents/skills/embedded-captions/references/reference-bar.md +47 -0
- package/.agents/skills/embedded-captions/references/scene-types.md +94 -0
- package/.agents/skills/embedded-captions/references/test-set.md +66 -0
- package/.agents/skills/embedded-captions/references/typographic-moves.md +266 -0
- package/.agents/skills/embedded-captions/references/typography-presets.md +63 -0
- package/.agents/skills/embedded-captions/scripts/audio-envelope.cjs +95 -0
- package/.agents/skills/embedded-captions/scripts/check-occlusion.cjs +250 -0
- package/.agents/skills/embedded-captions/scripts/check-overflow.cjs +194 -0
- package/.agents/skills/embedded-captions/scripts/check-rail-climax.cjs +233 -0
- package/.agents/skills/embedded-captions/scripts/check-timing.cjs +173 -0
- package/.agents/skills/embedded-captions/scripts/fill-timings.cjs +124 -0
- package/.agents/skills/embedded-captions/scripts/fit-fonts.cjs +158 -0
- package/.agents/skills/embedded-captions/scripts/gen-stroke-path.py +46 -0
- package/.agents/skills/embedded-captions/scripts/inject-fonts.cjs +169 -0
- package/.agents/skills/embedded-captions/scripts/lib-dna.cjs +201 -0
- package/.agents/skills/embedded-captions/scripts/make-cinematic.cjs +1205 -0
- package/.agents/skills/embedded-captions/scripts/make-composition.cjs +404 -0
- package/.agents/skills/embedded-captions/scripts/make-theme.cjs +8781 -0
- package/.agents/skills/embedded-captions/scripts/matte.cjs +294 -0
- package/.agents/skills/embedded-captions/scripts/measure-layout.cjs +293 -0
- package/.agents/skills/embedded-captions/scripts/prepare.sh +39 -0
- package/.agents/skills/embedded-captions/scripts/preview-frames.cjs +268 -0
- package/.agents/skills/embedded-captions/scripts/render-and-composite.sh +509 -0
- package/.agents/skills/embedded-captions/scripts/render-theme.sh +34 -0
- package/.agents/skills/embedded-captions/scripts/safe-zones.cjs +813 -0
- package/.agents/skills/embedded-captions/scripts/transcribe.cjs +349 -0
- package/.agents/skills/embedded-captions/themes/PORTING.md +49 -0
- package/.agents/skills/embedded-captions/themes/README.md +244 -0
- package/.agents/skills/embedded-captions/themes/anchor.json +27 -0
- package/.agents/skills/embedded-captions/themes/arcade.json +51 -0
- package/.agents/skills/embedded-captions/themes/aurora.json +41 -0
- package/.agents/skills/embedded-captions/themes/biolume.json +35 -0
- package/.agents/skills/embedded-captions/themes/brush.json +74 -0
- package/.agents/skills/embedded-captions/themes/chalkboard.json +52 -0
- package/.agents/skills/embedded-captions/themes/dossier.json +56 -0
- package/.agents/skills/embedded-captions/themes/graffiti.json +62 -0
- package/.agents/skills/embedded-captions/themes/hologram.json +41 -0
- package/.agents/skills/embedded-captions/themes/inkwater.json +43 -0
- package/.agents/skills/embedded-captions/themes/laser.json +46 -0
- package/.agents/skills/embedded-captions/themes/lastpage.json +33 -0
- package/.agents/skills/embedded-captions/themes/neonsign.json +53 -0
- package/.agents/skills/embedded-captions/themes/nightcity.json +56 -0
- package/.agents/skills/embedded-captions/themes/ordnance.json +54 -0
- package/.agents/skills/embedded-captions/themes/papercut.json +37 -0
- package/.agents/skills/embedded-captions/themes/popup.json +46 -0
- package/.agents/skills/embedded-captions/themes/ransom.json +62 -0
- package/.agents/skills/embedded-captions/themes/scoreboard.json +54 -0
- package/.agents/skills/embedded-captions/themes/spectrum.json +46 -0
- package/.agents/skills/embedded-captions/themes/stardust.json +29 -0
- package/.agents/skills/embedded-captions/themes/stomp.json +43 -0
- package/.agents/skills/embedded-captions/themes/terminal.json +49 -0
- package/.agents/skills/embedded-captions/themes/thunder.json +44 -0
- package/.agents/skills/embedded-captions/themes/transit.json +44 -0
- package/.agents/skills/embedded-captions/themes/vhs.json +47 -0
- package/.agents/skills/faceless-explainer/SKILL.md +209 -0
- package/.agents/skills/faceless-explainer/references/cut-catalog.md +215 -0
- package/.agents/skills/faceless-explainer/references/motion-language.md +156 -0
- package/.agents/skills/faceless-explainer/references/story-design.md +248 -0
- package/.agents/skills/faceless-explainer/references/visual-design.md +146 -0
- package/.agents/skills/faceless-explainer/scripts/assemble-index.mjs +570 -0
- package/.agents/skills/faceless-explainer/scripts/audio.mjs +260 -0
- package/.agents/skills/faceless-explainer/scripts/build-frame.mjs +536 -0
- package/.agents/skills/faceless-explainer/scripts/captions.mjs +508 -0
- package/.agents/skills/faceless-explainer/scripts/lib/assets.mjs +55 -0
- package/.agents/skills/faceless-explainer/scripts/lib/dimensions.mjs +45 -0
- package/.agents/skills/faceless-explainer/scripts/lib/storyboard.mjs +249 -0
- package/.agents/skills/faceless-explainer/scripts/lib/tokens.mjs +204 -0
- package/.agents/skills/faceless-explainer/scripts/lib/transition-registry.mjs +38 -0
- package/.agents/skills/faceless-explainer/scripts/lib/transitions.json +71 -0
- package/.agents/skills/faceless-explainer/scripts/transitions.mjs +320 -0
- package/.agents/skills/faceless-explainer/sub-agents/frame-worker.md +75 -0
- package/.agents/skills/flockposter/LICENSE +17 -0
- package/.agents/skills/flockposter/README.md +72 -0
- package/.agents/skills/flockposter/SKILL.md +562 -0
- package/.agents/skills/flockposter/examples/cli-instagram-reel.sh +21 -0
- package/.agents/skills/flockposter/examples/cli-multi-platform.json +69 -0
- package/.agents/skills/flockposter/examples/cli-tiktok-upload-only.sh +22 -0
- package/.agents/skills/flockposter/examples/cli-x-thread.sh +17 -0
- package/.agents/skills/flockposter/examples/cli-youtube-short.sh +21 -0
- package/.agents/skills/flockposter/examples/public-api-instagram-reel.json +28 -0
- package/.agents/skills/general-video/SKILL.md +143 -0
- package/.agents/skills/hyperframes/SKILL.md +160 -0
- package/.agents/skills/hyperframes-animation/SKILL.md +84 -0
- package/.agents/skills/hyperframes-animation/adapters/animate-text.md +64 -0
- package/.agents/skills/hyperframes-animation/adapters/animejs.md +114 -0
- package/.agents/skills/hyperframes-animation/adapters/css-animations.md +143 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-easing-and-stagger.md +118 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-timeline-and-labels.md +96 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-transforms-and-perf.md +96 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap.md +105 -0
- package/.agents/skills/hyperframes-animation/adapters/html-in-canvas-patterns.md +507 -0
- package/.agents/skills/hyperframes-animation/adapters/lottie.md +117 -0
- package/.agents/skills/hyperframes-animation/adapters/three.md +131 -0
- package/.agents/skills/hyperframes-animation/adapters/typegpu.md +178 -0
- package/.agents/skills/hyperframes-animation/adapters/waapi.md +101 -0
- package/.agents/skills/hyperframes-animation/blueprints/comparison-split.md +27 -0
- package/.agents/skills/hyperframes-animation/blueprints/constellation-hub.md +44 -0
- package/.agents/skills/hyperframes-animation/blueprints/cta-morph-press.md +28 -0
- package/.agents/skills/hyperframes-animation/blueprints/cursor-ui-demo.md +57 -0
- package/.agents/skills/hyperframes-animation/blueprints/dataviz-countup.md +46 -0
- package/.agents/skills/hyperframes-animation/blueprints/device-surface-showcase.md +53 -0
- package/.agents/skills/hyperframes-animation/blueprints/grid-card-assemble.md +66 -0
- package/.agents/skills/hyperframes-animation/blueprints/kinetic-type-beats.md +78 -0
- package/.agents/skills/hyperframes-animation/blueprints/logo-assemble-lockup.md +69 -0
- package/.agents/skills/hyperframes-animation/blueprints/overwhelm-surround.md +28 -0
- package/.agents/skills/hyperframes-animation/blueprints/spatial-pan-stations.md +37 -0
- package/.agents/skills/hyperframes-animation/blueprints/ticker-takeover.md +29 -0
- package/.agents/skills/hyperframes-animation/blueprints/titlecard-reveal.md +42 -0
- package/.agents/skills/hyperframes-animation/blueprints/typewriter-reveal.md +51 -0
- package/.agents/skills/hyperframes-animation/blueprints/video-text-pivot.md +30 -0
- package/.agents/skills/hyperframes-animation/blueprints-index.md +146 -0
- package/.agents/skills/hyperframes-animation/examples/assets/avatars/02.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/github.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/nvidia.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/visa.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/zoominfo.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/brand-reveal-assemble-zoom.html +382 -0
- package/.agents/skills/hyperframes-animation/examples/comparison-split-cards.html +649 -0
- package/.agents/skills/hyperframes-animation/examples/concept-demo-decode-pan.html +520 -0
- package/.agents/skills/hyperframes-animation/examples/cta-morph-press.html +468 -0
- package/.agents/skills/hyperframes-animation/examples/cta-orbit-collapse.html +1298 -0
- package/.agents/skills/hyperframes-animation/examples/demo-page-scroll-spotlight.html +759 -0
- package/.agents/skills/hyperframes-animation/examples/hook-counter-burst.html +729 -0
- package/.agents/skills/hyperframes-animation/examples/messaging-multi-phrase.html +352 -0
- package/.agents/skills/hyperframes-animation/examples/metric-video-text-pivot.html +779 -0
- package/.agents/skills/hyperframes-animation/examples/problem-mockup-overwhelm.html +1374 -0
- package/.agents/skills/hyperframes-animation/examples/proof-logo-chain.html +861 -0
- package/.agents/skills/hyperframes-animation/examples/takeover-ticker-displace.html +347 -0
- package/.agents/skills/hyperframes-animation/examples/workflow-approve-press.html +606 -0
- package/.agents/skills/hyperframes-animation/rules/3d-page-scroll.md +227 -0
- package/.agents/skills/hyperframes-animation/rules/3d-text-depth-layers.md +297 -0
- package/.agents/skills/hyperframes-animation/rules/ai-tracking-box.md +382 -0
- package/.agents/skills/hyperframes-animation/rules/ambient-glow-bloom.md +305 -0
- package/.agents/skills/hyperframes-animation/rules/asr-keyword-glow.md +286 -0
- package/.agents/skills/hyperframes-animation/rules/avatar-cloud-network.md +371 -0
- package/.agents/skills/hyperframes-animation/rules/camera-cursor-tracking.md +246 -0
- package/.agents/skills/hyperframes-animation/rules/card-morph-anchor.md +267 -0
- package/.agents/skills/hyperframes-animation/rules/center-outward-expansion.md +227 -0
- package/.agents/skills/hyperframes-animation/rules/context-sensitive-cursor.md +257 -0
- package/.agents/skills/hyperframes-animation/rules/coordinate-target-zoom.md +332 -0
- package/.agents/skills/hyperframes-animation/rules/counting-dynamic-scale.md +283 -0
- package/.agents/skills/hyperframes-animation/rules/css-marker-patterns.md +373 -0
- package/.agents/skills/hyperframes-animation/rules/cursor-click-ripple.md +262 -0
- package/.agents/skills/hyperframes-animation/rules/depth-of-field-blur.md +313 -0
- package/.agents/skills/hyperframes-animation/rules/depth-scatter-assemble.md +303 -0
- package/.agents/skills/hyperframes-animation/rules/discrete-text-sequence.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +307 -0
- package/.agents/skills/hyperframes-animation/rules/gsap-effects.md +299 -0
- package/.agents/skills/hyperframes-animation/rules/hacker-flip-3d.md +223 -0
- package/.agents/skills/hyperframes-animation/rules/kinetic-beat-slam.md +183 -0
- package/.agents/skills/hyperframes-animation/rules/motion-blur-streak.md +328 -0
- package/.agents/skills/hyperframes-animation/rules/multi-phase-camera.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/orbit-3d-entry.md +301 -0
- package/.agents/skills/hyperframes-animation/rules/physics-press-reaction.md +350 -0
- package/.agents/skills/hyperframes-animation/rules/press-release-spring.md +296 -0
- package/.agents/skills/hyperframes-animation/rules/reactive-displacement.md +277 -0
- package/.agents/skills/hyperframes-animation/rules/scale-swap-transition.md +298 -0
- package/.agents/skills/hyperframes-animation/rules/sine-wave-loop.md +278 -0
- package/.agents/skills/hyperframes-animation/rules/split-tilt-cards.md +277 -0
- package/.agents/skills/hyperframes-animation/rules/spring-pop-entrance.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/stat-bars-and-fills.md +156 -0
- package/.agents/skills/hyperframes-animation/rules/svg-icon-enrichment.md +329 -0
- package/.agents/skills/hyperframes-animation/rules/svg-path-draw.md +274 -0
- package/.agents/skills/hyperframes-animation/rules/vertical-spring-ticker.md +239 -0
- package/.agents/skills/hyperframes-animation/rules/viewport-change.md +349 -0
- package/.agents/skills/hyperframes-animation/rules-index.md +86 -0
- package/.agents/skills/hyperframes-animation/scripts/animation-map.mjs +606 -0
- package/.agents/skills/hyperframes-animation/scripts/package-loader.mjs +288 -0
- package/.agents/skills/hyperframes-animation/scripts/package-loader.test.mjs +62 -0
- package/.agents/skills/hyperframes-animation/techniques.md +507 -0
- package/.agents/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +167 -0
- package/.agents/skills/hyperframes-animation/transitions/catalog.md +127 -0
- package/.agents/skills/hyperframes-animation/transitions/css-3d.md +12 -0
- package/.agents/skills/hyperframes-animation/transitions/css-blur.md +51 -0
- package/.agents/skills/hyperframes-animation/transitions/css-cover.md +43 -0
- package/.agents/skills/hyperframes-animation/transitions/css-destruction.md +95 -0
- package/.agents/skills/hyperframes-animation/transitions/css-dissolve.md +66 -0
- package/.agents/skills/hyperframes-animation/transitions/css-distortion.md +45 -0
- package/.agents/skills/hyperframes-animation/transitions/css-grid.md +10 -0
- package/.agents/skills/hyperframes-animation/transitions/css-light.md +49 -0
- package/.agents/skills/hyperframes-animation/transitions/css-mechanical.md +30 -0
- package/.agents/skills/hyperframes-animation/transitions/css-other.md +25 -0
- package/.agents/skills/hyperframes-animation/transitions/css-push.md +41 -0
- package/.agents/skills/hyperframes-animation/transitions/css-radial.md +37 -0
- package/.agents/skills/hyperframes-animation/transitions/css-scale.md +24 -0
- package/.agents/skills/hyperframes-animation/transitions/overview.md +153 -0
- package/.agents/skills/hyperframes-cli/SKILL.md +113 -0
- package/.agents/skills/hyperframes-cli/references/doctor-browser.md +45 -0
- package/.agents/skills/hyperframes-cli/references/init-and-scaffold.md +55 -0
- package/.agents/skills/hyperframes-cli/references/lambda.md +132 -0
- package/.agents/skills/hyperframes-cli/references/lint-validate-inspect.md +121 -0
- package/.agents/skills/hyperframes-cli/references/preview-render.md +149 -0
- package/.agents/skills/hyperframes-cli/references/upgrade-info-misc.md +75 -0
- package/.agents/skills/hyperframes-core/SKILL.md +78 -0
- package/.agents/skills/hyperframes-core/references/composition-patterns.md +263 -0
- package/.agents/skills/hyperframes-core/references/data-attributes.md +70 -0
- package/.agents/skills/hyperframes-core/references/determinism-rules.md +68 -0
- package/.agents/skills/hyperframes-core/references/full-screen-motion.md +62 -0
- package/.agents/skills/hyperframes-core/references/minimal-composition.md +66 -0
- package/.agents/skills/hyperframes-core/references/script-format.md +49 -0
- package/.agents/skills/hyperframes-core/references/storyboard-format.md +95 -0
- package/.agents/skills/hyperframes-core/references/sub-compositions.md +237 -0
- package/.agents/skills/hyperframes-core/references/subagent-dispatch.md +41 -0
- package/.agents/skills/hyperframes-core/references/tailwind.md +125 -0
- package/.agents/skills/hyperframes-core/references/tracks-and-clips.md +76 -0
- package/.agents/skills/hyperframes-core/references/variables-and-media.md +90 -0
- package/.agents/skills/hyperframes-creative/SKILL.md +70 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md +289 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/caption-skin.html +221 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/frame-showcase.html +1214 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/FRAME.md +275 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/frame-showcase.html +1347 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/FRAME.md +307 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/caption-skin.html +223 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/frame-showcase.html +1372 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/FRAME.md +275 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/caption-skin.html +230 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/frame-showcase.html +1140 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/FRAME.md +284 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/caption-skin.html +225 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/frame-showcase.html +1166 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/FRAME.md +284 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/frame-showcase.html +1465 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/FRAME.md +278 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/caption-skin.html +222 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/frame-showcase.html +1263 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/FRAME.md +277 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/frame-showcase.html +1439 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md +265 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/caption-skin.html +238 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/frame-showcase.html +1468 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/FRAME.md +314 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/caption-skin.html +226 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/frame-showcase.html +1268 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/FRAME.md +333 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/caption-skin.html +227 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/frame-showcase.html +1330 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/FRAME.md +274 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/caption-skin.html +230 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/frame-showcase.html +1444 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/FRAME.md +265 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/caption-skin.html +223 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/frame-showcase.html +1273 -0
- package/.agents/skills/hyperframes-creative/palettes/bold-energetic.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/clean-corporate.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/dark-premium.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/jewel-rich.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/monochrome.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/nature-earth.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/neon-electric.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/pastel-soft.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/warm-editorial.md +14 -0
- package/.agents/skills/hyperframes-creative/references/audio-reactive.md +76 -0
- package/.agents/skills/hyperframes-creative/references/beat-direction.md +164 -0
- package/.agents/skills/hyperframes-creative/references/composition-patterns.md +199 -0
- package/.agents/skills/hyperframes-creative/references/data-in-motion.md +19 -0
- package/.agents/skills/hyperframes-creative/references/design-adherence.md +19 -0
- package/.agents/skills/hyperframes-creative/references/design-picker.md +123 -0
- package/.agents/skills/hyperframes-creative/references/design-spec.md +55 -0
- package/.agents/skills/hyperframes-creative/references/house-style.md +73 -0
- package/.agents/skills/hyperframes-creative/references/motion-principles.md +150 -0
- package/.agents/skills/hyperframes-creative/references/narration.md +92 -0
- package/.agents/skills/hyperframes-creative/references/prompt-expansion.md +68 -0
- package/.agents/skills/hyperframes-creative/references/typography.md +218 -0
- package/.agents/skills/hyperframes-creative/references/video-composition.md +63 -0
- package/.agents/skills/hyperframes-creative/references/visual-styles.md +457 -0
- package/.agents/skills/hyperframes-creative/scripts/contrast-report.mjs +353 -0
- package/.agents/skills/hyperframes-creative/scripts/extract-audio-data.py +188 -0
- package/.agents/skills/hyperframes-creative/scripts/package-loader.mjs +288 -0
- package/.agents/skills/hyperframes-creative/scripts/package-loader.test.mjs +62 -0
- package/.agents/skills/hyperframes-creative/templates/design-picker.html +1432 -0
- package/.agents/skills/hyperframes-keyframes/SKILL.md +237 -0
- package/.agents/skills/hyperframes-keyframes/agents/openai.yaml +4 -0
- package/.agents/skills/hyperframes-keyframes/references/keyframe-patterns.md +106 -0
- package/.agents/skills/motion-graphics/SKILL.md +172 -0
- package/.agents/skills/motion-graphics/agents/builder.md +40 -0
- package/.agents/skills/motion-graphics/agents/director.md +53 -0
- package/.agents/skills/motion-graphics/agents/finalize.md +17 -0
- package/.agents/skills/motion-graphics/catalog-map.md +40 -0
- package/.agents/skills/motion-graphics/categories/asset-fusion/module.md +37 -0
- package/.agents/skills/motion-graphics/categories/charts/module.md +21 -0
- package/.agents/skills/motion-graphics/categories/kinetic-type/module.md +19 -0
- package/.agents/skills/motion-graphics/categories/logo-reveal/module.md +17 -0
- package/.agents/skills/motion-graphics/categories/lower-thirds/module.md +16 -0
- package/.agents/skills/motion-graphics/categories/maps/bake-basemap.mjs +273 -0
- package/.agents/skills/motion-graphics/categories/maps/module.md +61 -0
- package/.agents/skills/motion-graphics/categories/news/module.md +56 -0
- package/.agents/skills/motion-graphics/categories/stat/module.md +21 -0
- package/.agents/skills/motion-graphics/categories/tweet/module.md +16 -0
- package/.agents/skills/motion-graphics/categories/webpage/module.md +21 -0
- package/.agents/skills/motion-graphics/grounding/PROTOCOL.md +64 -0
- package/.agents/skills/motion-graphics/grounding/locate.mjs +227 -0
- package/.agents/skills/motion-graphics/phases/source/guide.md +21 -0
- package/.agents/skills/motion-graphics/references/builder-contract.md +38 -0
- package/.agents/skills/motion-graphics/references/motion-vocabulary.md +43 -0
- package/.agents/skills/motion-graphics/references/shot-plan-ir.md +54 -0
- package/.agents/skills/motion-graphics/samples/asset-fusion/_ref-circle-highlight.html +306 -0
- package/.agents/skills/product-launch-video/SKILL.md +208 -0
- package/.agents/skills/product-launch-video/references/cut-catalog.md +220 -0
- package/.agents/skills/product-launch-video/references/motion-language.md +156 -0
- package/.agents/skills/product-launch-video/references/story-design.md +373 -0
- package/.agents/skills/product-launch-video/references/visual-design.md +126 -0
- package/.agents/skills/product-launch-video/scripts/assemble-index.mjs +570 -0
- package/.agents/skills/product-launch-video/scripts/audio.mjs +260 -0
- package/.agents/skills/product-launch-video/scripts/build-frame.mjs +536 -0
- package/.agents/skills/product-launch-video/scripts/captions.mjs +508 -0
- package/.agents/skills/product-launch-video/scripts/lib/assets.mjs +55 -0
- package/.agents/skills/product-launch-video/scripts/lib/dimensions.mjs +45 -0
- package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.mjs +36 -0
- package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.test.mjs +76 -0
- package/.agents/skills/product-launch-video/scripts/lib/storyboard.mjs +249 -0
- package/.agents/skills/product-launch-video/scripts/lib/tokens.mjs +204 -0
- package/.agents/skills/product-launch-video/scripts/lib/transition-registry.mjs +38 -0
- package/.agents/skills/product-launch-video/scripts/lib/transitions.json +71 -0
- package/.agents/skills/product-launch-video/scripts/stage-assets.mjs +39 -0
- package/.agents/skills/product-launch-video/scripts/transitions.mjs +327 -0
- package/.agents/skills/product-launch-video/sub-agents/frame-worker.md +75 -0
- package/.agents/skills/slideshow/SKILL.md +550 -0
- package/.agents/skills/slideshow/references/standalone-harness.md +1020 -0
- package/.agents/skills/talking-head-recut/NOTICE.md +39 -0
- package/.agents/skills/talking-head-recut/SKILL.md +1195 -0
- package/.agents/skills/talking-head-recut/assets/vendor/gsap.min.js +10 -0
- package/.agents/skills/talking-head-recut/references/DESIGN_INDEX.md +145 -0
- package/.agents/skills/talking-head-recut/references/frames/clean.html +92 -0
- package/.agents/skills/talking-head-recut/references/frames/hairline.html +171 -0
- package/.agents/skills/talking-head-recut/references/frames/polaroid.html +131 -0
- package/.agents/skills/talking-head-recut/references/layouts/overlay.html +164 -0
- package/.agents/skills/talking-head-recut/references/layouts/pip.html +143 -0
- package/.agents/skills/talking-head-recut/references/layouts/split.html +121 -0
- package/.agents/skills/talking-head-recut/references/layouts/stack.html +109 -0
- package/.agents/skills/talking-head-recut/references/styles/academic.html +172 -0
- package/.agents/skills/talking-head-recut/references/styles/audit.html +170 -0
- package/.agents/skills/talking-head-recut/references/styles/editorial.html +189 -0
- package/.agents/skills/talking-head-recut/references/styles/geom.html +181 -0
- package/.agents/skills/talking-head-recut/references/styles/minimal.html +130 -0
- package/.agents/skills/talking-head-recut/references/styles/spotlight.html +142 -0
- package/.agents/skills/talking-head-recut/references/styles/swiss.html +188 -0
- package/.agents/skills/talking-head-recut/references/styles/terminal.html +196 -0
- package/.agents/skills/talking-head-recut/references/styles/whiteboard.html +170 -0
- package/.agents/skills/talking-head-recut/references/styles/xhs.html +206 -0
- package/.agents/skills/vidfarm-media/SKILL.md +85 -0
- package/.agents/skills/vidfarm-media/references/tts.md +54 -0
- package/.agents/skills/vidfarm-media/scripts/audio.mjs +628 -0
- package/.agents/skills/vidfarm-media/scripts/wait-bgm.mjs +31 -0
- package/.agents/skills/website-to-video/SKILL.md +145 -0
- package/.agents/skills/website-to-video/assets/sfx/CREDITS.md +35 -0
- package/.agents/skills/website-to-video/assets/sfx/manifest.json +97 -0
- package/.agents/skills/website-to-video/references/beat-builder-guide.md +263 -0
- package/.agents/skills/website-to-video/references/capabilities.md +713 -0
- package/.agents/skills/website-to-video/references/step-0-capture.md +55 -0
- package/.agents/skills/website-to-video/references/step-1-design.md +333 -0
- package/.agents/skills/website-to-video/references/step-2-brief.md +178 -0
- package/.agents/skills/website-to-video/references/step-3-storyboard.md +572 -0
- package/.agents/skills/website-to-video/references/step-4-vo.md +225 -0
- package/.agents/skills/website-to-video/references/step-5-build.md +483 -0
- package/.agents/skills/website-to-video/references/step-6-validate.md +341 -0
- package/.agents/skills/website-to-video/scripts/w2h-verify.mjs +759 -0
- package/SKILL.director.md +37 -0
- package/SKILL.platform.md +6 -1
- package/demo/dist/app.js +295 -11
- package/dist/src/app.js +317 -133
- package/dist/src/cli.js +529 -12
- package/dist/src/composition-runtime.js +262 -3
- package/dist/src/devcli/doctor.js +192 -0
- package/dist/src/devcli/hyperframes-cli.js +118 -0
- package/dist/src/devcli/skills.js +476 -0
- package/dist/src/devcli/stills.js +249 -0
- package/dist/src/editor-chat.js +255 -0
- package/dist/src/hyperframes/composition.js +5 -5
- package/dist/src/services/composition-lint.js +199 -0
- package/dist/src/services/hyperframes.js +67 -13
- package/package.json +2 -1
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
// storyboard.mjs — vendored lenient parser for STORYBOARD.md.
|
|
2
|
+
//
|
|
3
|
+
// Faithful plain-JS port of @hyperframes/core/storyboard
|
|
4
|
+
// (packages/core/src/storyboard/parseStoryboard.ts). Vendored because skills
|
|
5
|
+
// ship standalone: installed via `npx skills add`, a skill's scripts can't reach
|
|
6
|
+
// the monorepo's core package, and the core export points at .ts source that
|
|
7
|
+
// `node` (which runs these scripts) can't load. CANONICAL contract = the core
|
|
8
|
+
// parser + skills/hyperframes-core/references/storyboard-format.md; keep this in
|
|
9
|
+
// lockstep. Behavior: never throws, accepts freeform narrative, recognizes
|
|
10
|
+
// Frame/Beat/Scene headings at H2/H3, preserves unknown keys verbatim under
|
|
11
|
+
// `extra` (keys lowercased). Pure node — no deps.
|
|
12
|
+
|
|
13
|
+
export const FRAME_STATUSES = ["outline", "built", "animated"];
|
|
14
|
+
export const DEFAULT_FRAME_STATUS = "outline";
|
|
15
|
+
|
|
16
|
+
// Detection-only frame heading (ends at the keyword); ReDoS-hardened — keep as-is.
|
|
17
|
+
const FRAME_HEADING_RE = /^(#{2,3})[ \t]+(?:frame|beat|scene)\b/i;
|
|
18
|
+
const FRAME_TITLE_SEP_RE = /^[\s.:—-]+/;
|
|
19
|
+
const HEADING_LEVEL_RE = /^(#{1,6})\s+/;
|
|
20
|
+
const META_RE = /^\s*[-*]\s+([A-Za-z_][\w-]*)\s*:\s*(.+?)\s*$/;
|
|
21
|
+
const LEADING_INT_RE = /^(\d+)/;
|
|
22
|
+
const DURATION_NUM_RE = /(\d+(?:\.\d+)?)/;
|
|
23
|
+
const TRANSITION_KEYS = new Set(["transition_in", "transitionin", "transition"]);
|
|
24
|
+
const SCENE_KEYS = new Set(["scene", "description", "summary", "caption"]);
|
|
25
|
+
export const VOICEOVER_ALIASES = ["voiceover", "vo", "voice_over", "narration"];
|
|
26
|
+
const VOICEOVER_KEYS = new Set(VOICEOVER_ALIASES);
|
|
27
|
+
|
|
28
|
+
export function parseStoryboard(source) {
|
|
29
|
+
const warnings = [];
|
|
30
|
+
const { globals, bodyStartLine, body } = parseFrontmatter(source, warnings);
|
|
31
|
+
const frames = parseFrames(body, bodyStartLine, warnings);
|
|
32
|
+
return { globals, frames, warnings };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function emptyGlobals() {
|
|
36
|
+
return { extra: {} };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function isFrameStatus(value) {
|
|
40
|
+
return FRAME_STATUSES.includes(value);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// ── Frontmatter ─────────────────────────────────────────────────────────────
|
|
44
|
+
function findFrontmatterRange(lines, warnings) {
|
|
45
|
+
let start = 0;
|
|
46
|
+
while (start < lines.length && (lines[start] ?? "").trim() === "") start++;
|
|
47
|
+
if ((lines[start] ?? "").trim() !== "---") return null;
|
|
48
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
49
|
+
if ((lines[i] ?? "").trim() === "---") return { start, end: i };
|
|
50
|
+
}
|
|
51
|
+
warnings.push({
|
|
52
|
+
message: "Frontmatter opening '---' has no closing '---'; treating whole file as body.",
|
|
53
|
+
line: start + 1,
|
|
54
|
+
});
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function parseFrontmatterEntries(lines, start, end, warnings) {
|
|
59
|
+
const globals = emptyGlobals();
|
|
60
|
+
for (let i = start + 1; i < end; i++) {
|
|
61
|
+
const raw = lines[i] ?? "";
|
|
62
|
+
if (raw.trim() === "") continue;
|
|
63
|
+
const colon = raw.indexOf(":");
|
|
64
|
+
if (colon === -1) {
|
|
65
|
+
warnings.push({
|
|
66
|
+
message: `Ignored non key:value frontmatter line: "${raw.trim()}"`,
|
|
67
|
+
line: i + 1,
|
|
68
|
+
});
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const key = raw.slice(0, colon).trim().toLowerCase();
|
|
72
|
+
assignGlobal(globals, key, stripQuotes(raw.slice(colon + 1).trim()));
|
|
73
|
+
}
|
|
74
|
+
return globals;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function parseFrontmatter(source, warnings) {
|
|
78
|
+
const lines = source.split(/\r?\n/);
|
|
79
|
+
const range = findFrontmatterRange(lines, warnings);
|
|
80
|
+
if (!range) return { globals: emptyGlobals(), bodyStartLine: 1, body: source };
|
|
81
|
+
const globals = parseFrontmatterEntries(lines, range.start, range.end, warnings);
|
|
82
|
+
const body = lines.slice(range.end + 1).join("\n");
|
|
83
|
+
return { globals, bodyStartLine: range.end + 2, body };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function assignGlobal(globals, key, value) {
|
|
87
|
+
switch (key) {
|
|
88
|
+
case "format":
|
|
89
|
+
globals.format = value;
|
|
90
|
+
break;
|
|
91
|
+
case "message":
|
|
92
|
+
globals.message = value;
|
|
93
|
+
break;
|
|
94
|
+
case "arc":
|
|
95
|
+
globals.arc = value;
|
|
96
|
+
break;
|
|
97
|
+
case "audience":
|
|
98
|
+
globals.audience = value;
|
|
99
|
+
break;
|
|
100
|
+
default:
|
|
101
|
+
globals.extra[key] = value;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ── Frames ──────────────────────────────────────────────────────────────────
|
|
106
|
+
function openFrameSection(line, headingLine) {
|
|
107
|
+
const match = FRAME_HEADING_RE.exec(line);
|
|
108
|
+
if (!match) return null;
|
|
109
|
+
const headingText = line.slice(match[0].length).replace(FRAME_TITLE_SEP_RE, "").trim();
|
|
110
|
+
return { headingText, headingLine, level: (match[1] ?? "##").length, lines: [] };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function endsFrameSection(line, current) {
|
|
114
|
+
if (!current) return false;
|
|
115
|
+
const heading = HEADING_LEVEL_RE.exec(line);
|
|
116
|
+
return heading !== null && (heading[1] ?? "").length <= current.level;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function parseFrames(body, bodyStartLine, warnings) {
|
|
120
|
+
const lines = body.split(/\r?\n/);
|
|
121
|
+
const sections = [];
|
|
122
|
+
let current = null;
|
|
123
|
+
for (let i = 0; i < lines.length; i++) {
|
|
124
|
+
const line = lines[i] ?? "";
|
|
125
|
+
const opened = openFrameSection(line, bodyStartLine + i);
|
|
126
|
+
if (opened) {
|
|
127
|
+
sections.push(opened);
|
|
128
|
+
current = opened;
|
|
129
|
+
} else if (endsFrameSection(line, current)) {
|
|
130
|
+
current = null;
|
|
131
|
+
} else if (current) {
|
|
132
|
+
current.lines.push(line);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return sections.map((section, idx) => buildFrame(section, idx + 1, warnings));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function buildFrame(section, index, warnings) {
|
|
139
|
+
const frame = { index, status: DEFAULT_FRAME_STATUS, narrative: "", extra: {} };
|
|
140
|
+
const { number, title } = parseHeading(section.headingText);
|
|
141
|
+
if (number !== undefined) frame.number = number;
|
|
142
|
+
if (title) frame.title = title;
|
|
143
|
+
|
|
144
|
+
const narrativeLines = [];
|
|
145
|
+
for (const line of section.lines) {
|
|
146
|
+
const meta = META_RE.exec(line);
|
|
147
|
+
if (meta) {
|
|
148
|
+
applyMeta(
|
|
149
|
+
frame,
|
|
150
|
+
(meta[1] ?? "").toLowerCase(),
|
|
151
|
+
(meta[2] ?? "").trim(),
|
|
152
|
+
section.headingLine,
|
|
153
|
+
warnings,
|
|
154
|
+
);
|
|
155
|
+
} else {
|
|
156
|
+
narrativeLines.push(line);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
frame.narrative = narrativeLines.join("\n").trim();
|
|
160
|
+
return frame;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function parseHeading(text) {
|
|
164
|
+
if (!text) return {};
|
|
165
|
+
const intMatch = LEADING_INT_RE.exec(text);
|
|
166
|
+
if (!intMatch) return { title: text };
|
|
167
|
+
const number = Number.parseInt(intMatch[1] ?? "", 10);
|
|
168
|
+
const rest = text
|
|
169
|
+
.slice((intMatch[0] ?? "").length)
|
|
170
|
+
.replace(/^[\s.:—-]+/, "")
|
|
171
|
+
.trim();
|
|
172
|
+
return { number, title: rest || undefined };
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Dispatch a recognized metadata key to its field, else stash under `extra`.
|
|
176
|
+
// Mirrors core's META_SETTERS map exactly (direct keys + alias sets).
|
|
177
|
+
function applyMeta(frame, key, value, headingLine, warnings) {
|
|
178
|
+
switch (key) {
|
|
179
|
+
case "duration":
|
|
180
|
+
applyDuration(frame, value, headingLine, warnings);
|
|
181
|
+
return;
|
|
182
|
+
case "status":
|
|
183
|
+
applyStatus(frame, value, headingLine, warnings);
|
|
184
|
+
return;
|
|
185
|
+
case "poster":
|
|
186
|
+
applyPoster(frame, value);
|
|
187
|
+
return;
|
|
188
|
+
case "src":
|
|
189
|
+
frame.src = value;
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (TRANSITION_KEYS.has(key)) {
|
|
193
|
+
frame.transitionIn = value;
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (SCENE_KEYS.has(key)) {
|
|
197
|
+
frame.scene = value;
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (VOICEOVER_KEYS.has(key)) {
|
|
201
|
+
frame.voiceover = stripQuotes(value);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
frame.extra[key] = value;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function applyPoster(frame, value) {
|
|
208
|
+
const num = DURATION_NUM_RE.exec(value);
|
|
209
|
+
if (num) frame.poster = Number.parseFloat(num[1] ?? "");
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function applyDuration(frame, value, headingLine, warnings) {
|
|
213
|
+
frame.duration = value;
|
|
214
|
+
const num = DURATION_NUM_RE.exec(value);
|
|
215
|
+
if (num) {
|
|
216
|
+
frame.durationSeconds = Number.parseFloat(num[1] ?? "");
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
warnings.push({
|
|
220
|
+
message: `Frame ${frame.index}: could not parse duration "${value}".`,
|
|
221
|
+
line: headingLine,
|
|
222
|
+
frameIndex: frame.index,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function applyStatus(frame, value, headingLine, warnings) {
|
|
227
|
+
const normalized = value.toLowerCase();
|
|
228
|
+
if (isFrameStatus(normalized)) {
|
|
229
|
+
frame.status = normalized;
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
frame.extra.status = value;
|
|
233
|
+
warnings.push({
|
|
234
|
+
message: `Frame ${frame.index}: unknown status "${value}"; defaulting to "${DEFAULT_FRAME_STATUS}".`,
|
|
235
|
+
line: headingLine,
|
|
236
|
+
frameIndex: frame.index,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function stripQuotes(value) {
|
|
241
|
+
if (value.length >= 2) {
|
|
242
|
+
const first = value[0];
|
|
243
|
+
const last = value[value.length - 1];
|
|
244
|
+
if ((first === '"' && last === '"') || (first === "'" && last === "'")) {
|
|
245
|
+
return value.slice(1, -1);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return value;
|
|
249
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
// tokens.mjs — shared brand-token parsing + semantic role mapping for frame.md /
|
|
2
|
+
// FRAME.md. Used by build-frame.mjs (remix a preset onto brand tokens) and
|
|
3
|
+
// captions.mjs (derive caption colors from frame.md). One mapping → frames and
|
|
4
|
+
// captions stay consistent. Pure node.
|
|
5
|
+
|
|
6
|
+
// Collect `key: value` pairs under the top-level `colors:` block (until dedent).
|
|
7
|
+
export function parseColors(md) {
|
|
8
|
+
const out = [];
|
|
9
|
+
let inBlock = false;
|
|
10
|
+
for (const line of md.split(/\r?\n/)) {
|
|
11
|
+
if (/^colors:\s*$/.test(line)) {
|
|
12
|
+
inBlock = true;
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
if (!inBlock) continue;
|
|
16
|
+
if (/^\S/.test(line)) break; // dedent to a top-level key → end of block
|
|
17
|
+
const m = line.match(
|
|
18
|
+
/^\s+([\w-]+):\s*(?:"([^"]+)"|'([^']+)'|(#[0-9a-fA-F]{3,8}|rgba?\([^)]*\)|[^#\s][^#\n]*?))\s*(?:#.*)?$/,
|
|
19
|
+
);
|
|
20
|
+
if (m) out.push([m[1], (m[2] ?? m[3] ?? m[4]).trim()]);
|
|
21
|
+
}
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// relative luminance of a #rrggbb (null for non-hex like rgba()).
|
|
26
|
+
export function lum(v) {
|
|
27
|
+
const m = /^#?([0-9a-fA-F]{6})$/.exec(String(v).trim());
|
|
28
|
+
if (!m) return null;
|
|
29
|
+
const n = parseInt(m[1], 16);
|
|
30
|
+
return 0.2126 * ((n >> 16) & 255) + 0.7152 * ((n >> 8) & 255) + 0.0722 * (n & 255);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// chroma (max−min channel) of a #rrggbb — a cheap "how colorful" proxy; −1 for non-hex.
|
|
34
|
+
export function chroma(v) {
|
|
35
|
+
const m = /^#?([0-9a-fA-F]{6})$/.exec(String(v).trim());
|
|
36
|
+
if (!m) return -1;
|
|
37
|
+
const n = parseInt(m[1], 16);
|
|
38
|
+
const r = (n >> 16) & 255,
|
|
39
|
+
g = (n >> 8) & 255,
|
|
40
|
+
b = n & 255;
|
|
41
|
+
return Math.max(r, g, b) - Math.min(r, g, b);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Browser user-agent default colors for links / visited links. These leak into a
|
|
45
|
+
// capture from any UNSTYLED <a> and are NOT brand colors — but being pure & saturated
|
|
46
|
+
// they beat a real accent on chroma alone. Never let one become the accent.
|
|
47
|
+
export const UA_DEFAULT_COLORS = new Set(
|
|
48
|
+
["#0000EE", "#0000FF", "#0000CC", "#1A0DAB", "#551A8B", "#EE0000"].map((c) => c.toUpperCase()),
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
// Pick the brand ACCENT — never by raw chroma alone, never a UA-default link color.
|
|
52
|
+
// Priority:
|
|
53
|
+
// 1) with capture colorStats → the colorful color that RECURS across the UI. The brand
|
|
54
|
+
// accent shows up in MANY roles (link text + icon + button + badge), whereas a one-off
|
|
55
|
+
// CTA fill appears in just one. So rank chromatic (chroma>40) candidates by role
|
|
56
|
+
// diversity first, then total prevalence, then interactive use, then chroma. This keeps
|
|
57
|
+
// a pervasive brand color (e.g. an indigo used everywhere) ahead of a single bright
|
|
58
|
+
// button fill (e.g. a lime used once) — the old "top interactiveBg" rule picked the
|
|
59
|
+
// latter. Requiring interactiveBg>0 is dropped so a text/icon-only accent can still win.
|
|
60
|
+
// 2) no stats → most chromatic color AFTER removing UA defaults + `exclude`.
|
|
61
|
+
// A stray default link color (e.g. #0000EE) can win under neither path.
|
|
62
|
+
export function pickAccent(stats, colors, exclude = []) {
|
|
63
|
+
const ban = new Set([...exclude, ...UA_DEFAULT_COLORS].map((c) => String(c).toUpperCase()));
|
|
64
|
+
const ok = (h) => /^#[0-9a-fA-F]{6}$/.test(String(h)) && !ban.has(String(h).toUpperCase());
|
|
65
|
+
// Prominence rank from the (frequency-ordered) `colors` palette: index 0 = most used.
|
|
66
|
+
// A saturated color sitting at the TAIL is almost always a one-off (a single CTA fill),
|
|
67
|
+
// not the brand accent — capture colorStats counts are too sparse to tell these apart
|
|
68
|
+
// (e.g. Linear's indigo and a lime CTA both register count≈1), but palette ORDER does.
|
|
69
|
+
const rank = new Map((colors ?? []).map((h, i) => [String(h).toUpperCase(), i]));
|
|
70
|
+
const prom = (h) => (rank.has(String(h).toUpperCase()) ? rank.get(String(h).toUpperCase()) : 1e9);
|
|
71
|
+
if (Array.isArray(stats) && stats.length) {
|
|
72
|
+
const roles = (s) =>
|
|
73
|
+
((s.interactiveBg || 0) > 0 ? 1 : 0) +
|
|
74
|
+
((s.textCount || 0) > 0 ? 1 : 0) +
|
|
75
|
+
((s.bgCount || 0) > 0 ? 1 : 0);
|
|
76
|
+
const a = stats
|
|
77
|
+
.filter((s) => ok(s?.hex) && chroma(s.hex) > 40)
|
|
78
|
+
.sort(
|
|
79
|
+
(x, y) =>
|
|
80
|
+
roles(y) - roles(x) || // used in MORE roles (link+icon+button) = the brand accent
|
|
81
|
+
prom(x.hex) - prom(y.hex) || // earlier in the palette = more prominent
|
|
82
|
+
(y.count || 0) - (x.count || 0) ||
|
|
83
|
+
(y.interactiveBg || 0) - (x.interactiveBg || 0) ||
|
|
84
|
+
chroma(y.hex) - chroma(x.hex),
|
|
85
|
+
);
|
|
86
|
+
if (a.length) return a[0].hex;
|
|
87
|
+
}
|
|
88
|
+
const c = (colors ?? [])
|
|
89
|
+
.map(String)
|
|
90
|
+
.filter(ok)
|
|
91
|
+
.sort((x, y) => chroma(y) - chroma(x));
|
|
92
|
+
return c[0];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Derive brand roles from rich capture colorStats (areaBg / interactiveBg / textCount /
|
|
96
|
+
// maxArea) — by semantic FUNCTION, not luminance/chroma proxies. Returns null when stats
|
|
97
|
+
// are unusable, so the caller can fall back. canvas = the color painting the most real
|
|
98
|
+
// background area (the page ground, dark or light); ink = the dominant text color that
|
|
99
|
+
// actually contrasts with the canvas; accent via pickAccent.
|
|
100
|
+
export function brandRolesFromStats(stats, colorsInOrder) {
|
|
101
|
+
if (!Array.isArray(stats) || !stats.length) return null;
|
|
102
|
+
const v = stats.filter((s) => /^#[0-9a-fA-F]{6}$/.test(s?.hex || ""));
|
|
103
|
+
if (!v.length) return null;
|
|
104
|
+
const canvas = [...v].sort(
|
|
105
|
+
(a, b) =>
|
|
106
|
+
(b.areaBg || 0) - (a.areaBg || 0) ||
|
|
107
|
+
(b.maxArea || 0) - (a.maxArea || 0) ||
|
|
108
|
+
(b.bgCount || 0) - (a.bgCount || 0),
|
|
109
|
+
)[0]?.hex;
|
|
110
|
+
// pass the frequency-ordered palette (tokens.colors) so pickAccent can use palette
|
|
111
|
+
// PROMINENCE — colorStats counts alone are too sparse to rank rare accents.
|
|
112
|
+
const accent = pickAccent(v, colorsInOrder ?? v.map((s) => s.hex), [canvas]);
|
|
113
|
+
if (!canvas || !accent) return null;
|
|
114
|
+
const cl = lum(canvas) ?? 0;
|
|
115
|
+
const ink =
|
|
116
|
+
[...v]
|
|
117
|
+
.filter((s) => s.hex !== canvas && s.hex !== accent)
|
|
118
|
+
.sort((a, b) => (b.textCount || 0) - (a.textCount || 0))
|
|
119
|
+
.find((s) => Math.abs((lum(s.hex) ?? 0) - cl) > 64)?.hex ??
|
|
120
|
+
(cl > 128 ? "#000000" : "#FFFFFF");
|
|
121
|
+
const accent2 =
|
|
122
|
+
v
|
|
123
|
+
.filter(
|
|
124
|
+
(s) =>
|
|
125
|
+
![canvas, ink, accent].includes(s.hex) &&
|
|
126
|
+
(s.interactiveBg || 0) > 0 &&
|
|
127
|
+
chroma(s.hex) > 40 &&
|
|
128
|
+
!UA_DEFAULT_COLORS.has(s.hex.toUpperCase()),
|
|
129
|
+
)
|
|
130
|
+
.sort((a, b) => (b.interactiveBg || 0) - (a.interactiveBg || 0))[0]?.hex ?? accent;
|
|
131
|
+
return { ink, canvas, accent, accent2 };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Map a list of [key, value] colors to semantic roles. ink = a dark/ink-named
|
|
135
|
+
// color (else darkest); canvas = a paper/cream/white-named color (else lightest);
|
|
136
|
+
// accents = whatever's left, ranked by chroma (the loudest color is almost always
|
|
137
|
+
// the brand accent) — UA-default link colors excluded so a stray <a> color never wins.
|
|
138
|
+
// For an unkeyed brand list, pass synthetic keys — name matching simply no-ops and it
|
|
139
|
+
// falls back to luminance/chroma, which is what we want. NOTE: when capture colorStats
|
|
140
|
+
// exist, prefer brandRolesFromStats() — it picks by function, not these proxies.
|
|
141
|
+
export function semanticColors(colors) {
|
|
142
|
+
if (!colors.length) return {};
|
|
143
|
+
const named = (re) => colors.find(([k]) => re.test(k));
|
|
144
|
+
const hexes = colors.filter(([, v]) => lum(v) != null);
|
|
145
|
+
const byLum = [...hexes].sort((a, b) => (lum(a[1]) ?? 1e9) - (lum(b[1]) ?? 1e9));
|
|
146
|
+
const pick = (m, fallback) => (m ? m[1] : fallback ? fallback[1] : undefined);
|
|
147
|
+
// "ink" must be a whole word-segment so "soft-pink"/"pink" don't match it.
|
|
148
|
+
const ink = pick(
|
|
149
|
+
named(/(?:^|[-_])ink(?:[-_]|$)|black|charcoal|^text(?:-dark)?$|outline|noir/i),
|
|
150
|
+
byLum[0] ?? colors[0],
|
|
151
|
+
);
|
|
152
|
+
const canvas = pick(
|
|
153
|
+
named(/cream|paper|canvas|white|bg|ground|surface|base|sand|parchment|off-?white|bone/i),
|
|
154
|
+
byLum[byLum.length - 1] ?? colors[colors.length - 1],
|
|
155
|
+
);
|
|
156
|
+
const accents = colors
|
|
157
|
+
.filter(([, v]) => v !== ink && v !== canvas && !UA_DEFAULT_COLORS.has(String(v).toUpperCase()))
|
|
158
|
+
.sort((a, b) => chroma(b[1]) - chroma(a[1]))
|
|
159
|
+
.map(([, v]) => v);
|
|
160
|
+
return { ink, canvas, accent: accents[0] ?? ink, accent2: accents[1] ?? accents[0] ?? ink };
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Collect role→fontFamily under the top-level `typography:` block; pick a display
|
|
164
|
+
// + body family from the usual role names. Returns quoted families (or null).
|
|
165
|
+
export function parseFonts(md) {
|
|
166
|
+
const roles = {};
|
|
167
|
+
let inBlock = false;
|
|
168
|
+
for (const line of md.split(/\r?\n/)) {
|
|
169
|
+
if (/^typography:\s*$/.test(line)) {
|
|
170
|
+
inBlock = true;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (!inBlock) continue;
|
|
174
|
+
if (/^\S/.test(line)) break;
|
|
175
|
+
const m = line.match(/^\s+([\w-]+):\s*\{[^}]*fontFamily:\s*"([^"]+)"/);
|
|
176
|
+
if (m) roles[m[1]] = m[2];
|
|
177
|
+
}
|
|
178
|
+
const q = (s) => (s ? `"${s}"` : null);
|
|
179
|
+
const body = roles.body ?? roles.subtitle ?? Object.values(roles)[0];
|
|
180
|
+
const display =
|
|
181
|
+
roles.display ??
|
|
182
|
+
roles.headline ??
|
|
183
|
+
roles["card-headline"] ??
|
|
184
|
+
roles["section-headline"] ??
|
|
185
|
+
roles["quote-display"] ??
|
|
186
|
+
roles.h1 ??
|
|
187
|
+
roles.h2 ??
|
|
188
|
+
roles.title ??
|
|
189
|
+
roles.hero ??
|
|
190
|
+
body;
|
|
191
|
+
// the monospace / chrome family (code, tags, ticks, page numbers) — so the remix can
|
|
192
|
+
// route a captured brand mono (Berkeley Mono, JetBrains Mono…) onto this role instead
|
|
193
|
+
// of the reading body. null when the preset has no distinct mono role.
|
|
194
|
+
const mono =
|
|
195
|
+
roles.mono ??
|
|
196
|
+
roles["mono-tag"] ??
|
|
197
|
+
roles["mono-chrome"] ??
|
|
198
|
+
roles["mono-tick"] ??
|
|
199
|
+
roles.code ??
|
|
200
|
+
roles.data ??
|
|
201
|
+
roles.pagenum ??
|
|
202
|
+
null;
|
|
203
|
+
return { display: q(display), body: q(body), mono: q(mono) };
|
|
204
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// transition-registry.mjs — loader for this skill's vendored transition registry
|
|
2
|
+
// (./transitions.json). The registry is the curated Tier-B subset (transform /
|
|
3
|
+
// opacity / filter on the two frame clip wrappers `#el-<id>`, no overlay DOM) +
|
|
4
|
+
// each type's GSAP template. Vendored into the skill so it ships standalone; the
|
|
5
|
+
// recipes originate from the shared catalog skills/hyperframes-animation/
|
|
6
|
+
// transitions/ (css-*.md) — keep them in step if those shared recipes change.
|
|
7
|
+
|
|
8
|
+
import { readFileSync } from "node:fs";
|
|
9
|
+
import { resolve, dirname } from "node:path";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
|
|
12
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
export const DEFAULT_REGISTRY_PATH = resolve(here, "./transitions.json");
|
|
14
|
+
|
|
15
|
+
let _cache = null;
|
|
16
|
+
|
|
17
|
+
export function loadTransitionRegistry(registryPath = DEFAULT_REGISTRY_PATH) {
|
|
18
|
+
if (_cache && _cache.path === registryPath) return _cache.data;
|
|
19
|
+
let data;
|
|
20
|
+
try {
|
|
21
|
+
data = JSON.parse(readFileSync(registryPath, "utf8"));
|
|
22
|
+
} catch (e) {
|
|
23
|
+
throw new Error(`transition registry not loadable at ${registryPath}: ${e.message}`);
|
|
24
|
+
}
|
|
25
|
+
if (!Array.isArray(data.transitions) || data.transitions.length === 0) {
|
|
26
|
+
throw new Error(`transition registry ${registryPath} has no transitions[]`);
|
|
27
|
+
}
|
|
28
|
+
_cache = { path: registryPath, data };
|
|
29
|
+
return data;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Convenience: a Map name -> transition record.
|
|
33
|
+
export function transitionsByName(registryPath = DEFAULT_REGISTRY_PATH) {
|
|
34
|
+
const data = loadTransitionRegistry(registryPath);
|
|
35
|
+
const map = new Map();
|
|
36
|
+
for (const t of data.transitions) map.set(t.name, t);
|
|
37
|
+
return map;
|
|
38
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Vendored transition registry for the product-launch workflow — the curated Tier-B subset (transform/opacity/filter on the two frame clip wrappers #el-<id>, no overlay DOM, no per-frame cooperation). Each type carries its GSAP template; the transitions.mjs injector stamps it onto window.__timelines[\"main\"]. Recipes originate from the shared catalog skills/hyperframes-animation/transitions/ (css-*.md) — keep in step if those change. Token placeholders the injector substitutes: __OLD__ (#el-<from>), __NEW__ (#el-<to>), __T__ (overlap-start s), __DUR__ (this boundary's duration), __DX__/__DXIN__ (horizontal travel + incoming offset), __DY__/__DYIN__ (vertical).",
|
|
3
|
+
"transitions": [
|
|
4
|
+
{
|
|
5
|
+
"name": "crossfade",
|
|
6
|
+
"energy": "any",
|
|
7
|
+
"default_duration_s": 0.5,
|
|
8
|
+
"directions": [],
|
|
9
|
+
"source": "css-dissolve.md",
|
|
10
|
+
"gsap_template": [
|
|
11
|
+
"tl.to(__OLD__, { opacity: 0, duration: __DUR__, ease: \"power2.inOut\" }, __T__);",
|
|
12
|
+
"tl.fromTo(__NEW__, { opacity: 0 }, { opacity: 1, duration: __DUR__, ease: \"power2.inOut\" }, __T__);"
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"name": "blur-crossfade",
|
|
17
|
+
"energy": "calm",
|
|
18
|
+
"default_duration_s": 0.6,
|
|
19
|
+
"directions": [],
|
|
20
|
+
"source": "css-dissolve.md",
|
|
21
|
+
"note": "Default when the two frames' #root backgrounds differ a lot — the blur masks the background-color clash a plain crossfade would expose.",
|
|
22
|
+
"gsap_template": [
|
|
23
|
+
"tl.to(__OLD__, { filter: \"blur(10px)\", scale: 1.03, opacity: 0, duration: __DUR__, ease: \"power2.inOut\" }, __T__);",
|
|
24
|
+
"tl.fromTo(__NEW__, { filter: \"blur(10px)\", scale: 0.97, opacity: 0 }, { filter: \"blur(0px)\", scale: 1, opacity: 1, duration: __DUR__, ease: \"power2.inOut\" }, __T__);"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "push-slide",
|
|
29
|
+
"energy": "medium",
|
|
30
|
+
"default_duration_s": 0.5,
|
|
31
|
+
"directions": ["LEFT", "RIGHT", "UP", "DOWN"],
|
|
32
|
+
"default_direction": "LEFT",
|
|
33
|
+
"source": "css-push.md",
|
|
34
|
+
"note": "Directional. The injector picks __DX__/__DY__ from the direction and emits the horizontal OR vertical pair (not both).",
|
|
35
|
+
"gsap_template_horizontal": [
|
|
36
|
+
"tl.to(__OLD__, { x: __DX__, duration: __DUR__, ease: \"power3.inOut\" }, __T__);",
|
|
37
|
+
"tl.fromTo(__NEW__, { x: __DXIN__, opacity: 1 }, { x: 0, duration: __DUR__, ease: \"power3.inOut\" }, __T__);"
|
|
38
|
+
],
|
|
39
|
+
"gsap_template_vertical": [
|
|
40
|
+
"tl.to(__OLD__, { y: __DY__, duration: __DUR__, ease: \"power3.inOut\" }, __T__);",
|
|
41
|
+
"tl.fromTo(__NEW__, { y: __DYIN__, opacity: 1 }, { y: 0, duration: __DUR__, ease: \"power3.inOut\" }, __T__);"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "zoom-through",
|
|
46
|
+
"energy": "high",
|
|
47
|
+
"default_duration_s": 0.4,
|
|
48
|
+
"directions": [],
|
|
49
|
+
"source": "css-scale.md",
|
|
50
|
+
"gsap_template": [
|
|
51
|
+
"tl.to(__OLD__, { scale: 2.5, opacity: 0, filter: \"blur(8px)\", duration: __DUR__, ease: \"power3.in\" }, __T__);",
|
|
52
|
+
"tl.fromTo(__NEW__, { scale: 0.5, opacity: 0, filter: \"blur(8px)\" }, { scale: 1, opacity: 1, filter: \"blur(0px)\", duration: __DUR__, ease: \"power3.out\" }, __T__);"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "squeeze",
|
|
57
|
+
"energy": "medium",
|
|
58
|
+
"default_duration_s": 0.4,
|
|
59
|
+
"directions": [],
|
|
60
|
+
"source": "css-push.md",
|
|
61
|
+
"note": "Old compresses to a vertical line on the left edge; new expands from the right edge. Incoming starts off (scaleX 0) so its higher-track stacking is harmless.",
|
|
62
|
+
"gsap_template": [
|
|
63
|
+
"tl.to(__OLD__, { scaleX: 0, transformOrigin: \"left center\", duration: __DUR__, ease: \"power3.inOut\" }, __T__);",
|
|
64
|
+
"tl.fromTo(__NEW__, { scaleX: 0, transformOrigin: \"right center\", opacity: 1 }, { scaleX: 1, transformOrigin: \"right center\", duration: __DUR__, ease: \"power3.inOut\" }, __T__);"
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"default_high_energy": "zoom-through",
|
|
69
|
+
"default_calm": "blur-crossfade",
|
|
70
|
+
"max_duration_s": 2.0
|
|
71
|
+
}
|