---
description: Technical implementation guide for Maximum Expressive M3 Typography. Contains code patterns for Variable Font axis manipulation (`GRAD`, `WONK`, `wdth`), COLRv1 palette switching, and Framer Motion typographic animations.
name: expressive-typography-manipulation
---
# Expressive Typography Manipulation
**Purpose**: Provide copy-pasteable strategies for implementing "Extreme Variability" in React.
**Target Audience**: AI Agents & Frontend Engineers.
## 1. The Variable Font Token System
Define these CSS Variables to control axes globally.
```css
:root {
/* --- The Workhorse (Lora/Serif) --- */
--font-body: "Lora Variable", serif;
/* Hover State: Grade Axis */
--type-action-grade-rest: 0;
--type-action-grade-hover: 150;
/* --- The Expressive (Fraunces) --- */
--font-display: "Fraunces Variable", serif;
/* Personality Axes */
--type-wonk-regular: 0;
--type-wonk-hand: 1;
--type-soft-sharp: 0;
--type-soft-inky: 50;
/* --- The Accent (Script/Color) --- */
--font-flourish: "Birthstone Bounce", cursive;
--font-cyberpunk: "Nabla", display;
}
```
## 2. "Layout-Safe" Interactions (The API)
Use this pattern to create interactive text that **does not reflow the page**.
### CSS Module / Styled Component
```tsx
import styled from "styled-components";
export const BreathingLabel = styled.span`
font-family: var(--font-body);
font-weight: 500;
font-variation-settings: "GRAD" var(--type-action-grade-rest);
transition: font-variation-settings 0.2s cubic-bezier(0.2, 0, 0, 1);
&:hover {
font-variation-settings: "GRAD" var(--type-action-grade-hover);
cursor: pointer;
}
`;
```
## 3. Motion-Driven Axis Animation (React)
Use `framer-motion` to map user inputs (Scroll, Mouse) to Font Axes.
### The "Scroll-Breathing" Header
_Header expands (Width) and gets wonkier (Wonk) as you scroll._
```tsx
import { motion, useScroll, useTransform } from "framer-motion";
export const LivingHeader = () => {
const { scrollYProgress } = useScroll();
// Transform scroll (0-1) to Axis Values
const width = useTransform(scrollYProgress, [0, 1], [100, 50]); // Compresses on scroll
const wonk = useTransform(scrollYProgress, [0, 0.5], [0, 1]); // Gets irregular
return (