vaweGitHub

Video componentsPoint the eye

Weight morph

Point the eyeswiss1.2 s

weight-morph.md

Weight morph: final frame of the highlight animation
00:00.0000:01.20
Tap the clip to play it.

When to use

Use when one word changes its meaning on screen: a claim gets heavier, a name becomes the brand. The wght axis of a variable font is a real interpolation, so the glyphs reshape (stems thicken, counters close) instead of a fake bold from stroke or scale. Archivo carries 100 to 900; Anybody, Geist, Inter and Fraunces in assets/fonts do too.

The code

css
@font-face { font-family: 'Archivo'; font-weight: 100 900; font-display: block;
             src: url('/assets/fonts/Archivo.woff2') format('woff2'); }
h1 { font: 200 18vh/1 'Archivo', sans-serif; letter-spacing: -0.02em;
     animation-name: thicken; animation-duration: 0.9s; animation-delay: var(--beat-1);
     animation-timing-function: var(--settle); animation-fill-mode: both; }
@keyframes thicken { to { font-weight: 900; letter-spacing: -0.04em; } }

Easing

Each ease is a pair of After Effects handles from core/motion/presets.js. Every curve as CSS.

EaseLeaving a keyArriving at a key
land12% influence, speed 4.875% influence, speed 0

Notes

html
<h1>weight</h1>
<script type="module">
import { EASE } from '../../core/motion/presets.js';
document.documentElement.style.setProperty('--settle', EASE.land);
</script>

Start at 200, not 100: a hairline at 100 vanishes against a dark ground and the first frames read as empty. Tighten letter-spacing with the weight (heavy type wants less air) so the word grows denser, not only wider. The @font-face must declare the range 100 900; with a single weight the browser synthesises bold and nothing morphs.

Looks (ground, type, radius, accent) live in demo/demo.css; this snippet keeps neutral tokens.

Sound

Sound: bloom at --beat-1; its low, slow body matches the word getting heavier (default gain).

Chain it into a film.

Copy chains of video components from the recipes.