A lightweight, type-safe TypeScript package for animating SVG path transitions using flubber and framer-motion in React. Interpolate smoothly between any number of SVG states with minimal setup.
- Smooth Shape Morphing: Automatically interpolates (morphs) between different SVG paths using
flubber. - Smart Transitions: Handles paths appearing and disappearing gracefully by animating opacity.
- Fully Customizable: Control
duration,ease, andloopsettings. - High Performance: Uses
framer-motion'suseTransformto animate outside the React render cycle. - Type-Safe: Written in TypeScript with strict definitions.
Install the package and its peers:
npm install @ghassen_abida/svg_animation
npm install react react-dom framer-motion flubber tailwind-mergeimport React from 'react';
import { InterpolatedSvgsAnimation } from '@ghassen_abida/svg_animation';
import { svgs } from './mySvgs';
export function App() {
return (
<div style={{ width: 200, height: 200 }}>
<InterpolatedSvgsAnimation
svgs={svgs}
duration={3}
ease="easeInOut"
loop={true}
fill="#1E40AF"
className="rounded-2xl shadow-lg"
/>
</div>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
svgs |
AnimationSvgs |
✅ | Array of SVG states (frames) to interpolate between. |
duration |
number |
5 |
Total duration of one full animation cycle in seconds. |
ease |
string | number[] |
"linear" |
Easing function (e.g., "easeInOut", "circOut", or bezier array). |
loop |
boolean |
true |
Whether the animation should loop infinitely. |
fill |
string |
– | Override fill color for all paths. |
className |
string |
– | CSS classes for the wrapper <div>. |
-
useMergedPaths(svgs: AnimationSvgs): Record<string, SvgPath>Returns a map of every unique path byid, using the first occurrence. -
useInterpolators(svgs: AnimationSvgs): Array<Record<string,(t:number)=>string>>Pre-computes flubber interpolation functions for each transition segment. -
Helpers in
src/utils/svgHelpers.ts:mergePaths(svgs: AnimationSvgs)createInterpolators(svgs: AnimationSvgs)
ganimation_package/
├─ src/
│ ├─ components/
│ │ └─ InterpolatedSvgsAnimation.tsx
│ ├─ hooks/
│ │ ├─ useMergedPaths.ts
│ │ └─ useInterpolators.ts
│ ├─ types.ts
│ ├─ utils/
│ │ └─ svgHelpers.ts
│ └─ index.ts
├─ sample/
│ └─ sampleSvgs.ts
├─ README.md
├─ package.json
├─ tsconfig.json
└─ .npmignore
- Fork the repository
- Create a feature branch (
git checkout -b my-feature) - Commit your changes (
git commit -m "feat: ...") - Push to your branch (
git push origin my-feature) - Open a Pull Request
MIT © Ghassen Abida && WAHIB MKADMI