Preset
fadeLeft
Enters from the right and fades leftward into rest, suiting content that should read as arriving from off the right edge.
Opacity + transform
Travels leftward into place.
Starts 28px to the right and fades in as it moves left. It carries an opacity key, so the server-rendered markup is hidden until hydration.
Usage
import { Section } from "@/lib/motion";
import { fadeLeft } from "@/lib/motion/presets/fade-left";
export function Features() {
return (
<Section {...fadeLeft} className="grid gap-6 md:grid-cols-3">
<FeatureCard title="Copy, do not install" />
<FeatureCard title="One file you own" />
<FeatureCard title="No wrappers" />
</Section>
);
}Installation
npx shadcn@latest add https://motion.asmitsah.dev/r/fade-left.jsonProps and tokens
What it sets
| Property | Initial | In view | Reduced motion | Reads from config.ts |
|---|---|---|---|---|
| opacity | 0 | 1 | Animates | fade.from → fade.to |
| x | 28 | 0 | Instant | travel.md → rest.x |
Transition and viewport
| Option | Value | Reads from config.ts |
|---|---|---|
| duration | 0.55 | duration.base |
| ease | [0.16,1,0.3,1] | ease |
| viewport.once | true | viewport |
| viewport.amount | "some" | viewport |
| viewport.margin | "0px 0px -12% 0px" | viewport |
Every motion prop the preset does not set — whileHover, whileTap, whileFocus — stays available at the call site. Write it after the spread and it wins.
layout and drag need the domMax feature bundle, not domAnimation — swap the lazy import in provider.tsx. It adds roughly 13kb gzipped on top of domAnimation.