PulsoIcon

Open source · 9,955 icons · 5 platforms

Icons that come alive.

9,955 carefully drawn icons, each with its own motion. Built for React, Vue, Svelte, Android and SwiftUI.

npm install pulsoicon-reactv6.0.2

One icon, four forms

Animated or still, outline or solid.

The same component, two props. Pick an icon and copy the line you need.

Animated outline<Heart />
Animated solid<Heart solid />
Static outline<Heart animated={false} />
Static solid<Heart solid animated={false} />

Hover a card to play it. The static ones stay still on purpose: animated={false} turns every trigger off.

Control

Animation, on your terms.

Icons play on hover and focus out of the box. Turn that off with autoAnimated={false} and play them from a ref or aplay prop, or switch every trigger off with animated={false}.

Hover or focus to animate

default
Inbox
Point at a button, or press Tab to focus one.
React
<button>
  <Bell /> Notifications
</button>
<a href="/inbox">
  <Mail /> Inbox
</a>

Click to play once

autoAnimated={false} + ref
Not saved yet
React
const check = useRef<IconHandle>(null);

async function save() {
  await saveDocument(); // your own code
  await check.current?.startAnimation();
}

<CircleCheck ref={check} autoAnimated={false} />

State-driven

play
React
<Bell autoAnimated={false} play={hasUnread} />

Download complete

play
Simulated in the page
React
<Download autoAnimated={false} play={progress === 100} />

Programmatic trigger

startAnimation() / stopAnimation()
React
const rocket = useRef<IconHandle>(null);

<Rocket ref={rocket} autoAnimated={false} />
<button onClick={() => rocket.current?.startAnimation()}>Play</button>
<button onClick={() => rocket.current?.stopAnimation()}>Stop</button>

Completely static

animated={false}
The ref and play do nothing either.
React
<Lock animated={false} />

Frameworks

One icon library. Every platform.

The props have the same names, defaults and meaning everywhere. One version number covers every package.

React

pulsoicon-react
import { Bell } from "pulsoicon-react";

<button>
  <Bell size={20} /> Notifications
</button>

Vue

pulsoicon-vue
<script setup lang="ts">
import { Bell } from "pulsoicon-vue";
</script>

<template>
  <Bell :size="20" />
</template>

Jetpack Compose

com.citypulso:pulsoicon-compose
PulsoIcon(
    PulsoIcons.Bell,
    contentDescription = "Notifications",
    interactionSource = interactions,
)

SwiftUI

PulsoIcon (Swift Package)
PulsoIconView(.bell, size: 20, play: hasNewMessage)

Library

9,955 icons to explore.

Search by name, by the names other icon sets use, or by category.

Popular

View all

Interface

View all

Brand logos

View all

New in 4.x

View all

Why PulsoIcon

Made for interfaces that feel alive.

  • A motion for every icon

    All 9,955 icons have their own motion, written for that icon: a bell rings, a trash can opens its lid.

  • Outline and solid

    Every icon also has a filled drawing. Motions that draw a stroke pop in instead on filled shapes.

  • Played from your code

    Hover and focus by default; a ref, a play prop or a handle when your app decides.

  • Five platforms, one source

    React, Vue, Svelte, Jetpack Compose and SwiftUI draw the same icons with the same motion and props.

  • Only what you import

    Each icon is its own module and the packages are side-effect free, so bundlers drop the icons you don't use.

  • Accessible and calm

    Icons are hidden from screen readers unless you label them, and nothing moves when the system asks for reduced motion.

  • Open source

    ISC licensed. Built on open icon sets, credited in the license, and maintained by CityPulso.

Quick install

Start in one line.

Then import an icon by name. Each platform's guide has every prop and how to play icons from code.

npm install pulsoicon-react