Preset
slideLeft
Enters from the right and travels leftward into rest, animating the x transform and nothing else.
Transform only
Travels leftward to rest.
The heading starts 16px to the right and moves left. No opacity key, so nothing is hidden while the JavaScript is still on the wire.
Usage
import { Section } from "@/lib/motion";
import { slideLeft } from "@/lib/motion/presets/slide-left";
export function Features() {
return (
<Section {...slideLeft} 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/slide-left.jsonProps and tokens
What it sets
| Property | Initial | In view | Reduced motion | Reads from config.ts |
|---|---|---|---|---|
| x | 16 | 0 | Instant | travel.sm → 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.