Skip to main content
Every export here mirrors an icon of the same name in @fanvue/ui and renders in the same box, so swapping the import path changes the motion and nothing about your layout.
This subpath needs the optional motion peer dependency. Install it alongside @fanvue/ui, or the import will fail to resolve — see Subpath exports.

Shared props

Every animated icon accepts the standard SVGAttributes of an <svg> element (className, style, aria-*), plus:
16 | 24 | 32
default:"24"
Pixel size, matching the static icon’s box exactly. Available on the 58 icons whose static twin is prop-based; the other 11 are sized with a utility class instead, e.g. className="size-6".
Ref<AnimatedIconHandle>
Drives the animation yourself. When set, hovering the icon no longer starts it, and onMouseEnter / onMouseLeave are forwarded untouched. The handle exposes startAnimation() and stopAnimation().
never
Not available. The animated artwork is stroke-only, so there is no filled variant to swap to; the prop is typed as never so passing it through a wrapper’s spread fails to compile instead of reaching the DOM.
Each icon also exports a matching <Name>Props and <Name>Handle type, so a wrapper component can forward the ref with full typing.

Driving the animation

Each icon animates on its own hover and focus. To drive it from a parent — a card that plays its icon when the whole card is hovered — pass a controlRef and call the handle.
Nothing animates under prefers-reduced-motion. SpinnerIcon is deliberately absent — a loading indicator must not wait for a hover.

All animated icons

Every name below imports from @fanvue/ui/animated-icons. The sizing column says how the icon is sized: the 58 icons whose static twin is prop-based take size, and the remaining 11 take a utility class. Artwork and animations from lucide-animated (MIT).
Setup: Installation · Theming · Subpath exports