<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: YC</title>
    <description>The latest articles on DEV Community by YC (@ycl2004).</description>
    <link>https://dev.to/ycl2004</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4233031%2F5021e2e5-0c49-464a-9403-9cff45b10ea3.png</url>
      <title>DEV Community: YC</title>
      <link>https://dev.to/ycl2004</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ycl2004"/>
    <language>en</language>
    <item>
      <title>9955 Icons, Every Single One Animated. PulsoIcon Hands-on</title>
      <dc:creator>YC</dc:creator>
      <pubDate>Sun, 08 Nov 2026 02:58:09 +0000</pubDate>
      <link>https://dev.to/ycl2004/9955-icons-every-single-one-animated-pulsoicon-hands-on-2cdc</link>
      <guid>https://dev.to/ycl2004/9955-icons-every-single-one-animated-pulsoicon-hands-on-2cdc</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8vl207lmotyfx86gzfiz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8vl207lmotyfx86gzfiz.png" alt="PulsoIcon animated icon library showcasing interactive icons and custom hover animations" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: buttons that feel dead
&lt;/h2&gt;

&lt;p&gt;If you build with Lucide like I do, your icons look clean — and do absolutely nothing.&lt;/p&gt;

&lt;p&gt;Hover a button, click a tab, and the icon just sits there. It's a small thing, but it's the kind of small thing that makes an interface feel static.&lt;/p&gt;

&lt;p&gt;PulsoIcon is what happens when someone decides every icon deserves its own motion.&lt;/p&gt;

&lt;p&gt;Not one generic hover effect stamped onto everything — a motion written for that specific icon.&lt;/p&gt;

&lt;p&gt;The bell rings. The trash can opens its lid. The clock's hand goes around.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;9,955 animated icons&lt;/strong&gt;, each with a hand-written motion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Five platforms from one source:&lt;/strong&gt; React, Vue, Svelte, Jetpack Compose, and SwiftUI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;About 3,700 custom-drawn icons&lt;/strong&gt;, including approximately 2,770 line-art brand logos. The rest build on Lucide, Tabler, and Iconoir shapes, all credited in the LICENSE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic hover and focus animations:&lt;/strong&gt; Icons respond when you hover over or focus on the nearest interactive button, link, or tab.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility built in:&lt;/strong&gt; Animations respect the user's &lt;code&gt;prefers-reduced-motion&lt;/code&gt; system setting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can browse and try all the icons live here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://pulsoicon.com" rel="noopener noreferrer"&gt;Explore the PulsoIcon Playground&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that sold me: it's a one-line switch
&lt;/h2&gt;

&lt;p&gt;The React package is designed as a drop-in replacement for &lt;code&gt;lucide-react&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Same component names. Same props.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Bell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Trash2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lucide-react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Bell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Trash2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pulsoicon-react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's the whole migration for most components.&lt;/p&gt;

&lt;p&gt;Your existing &lt;code&gt;size&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;, and &lt;code&gt;strokeWidth&lt;/code&gt; props keep working.&lt;/p&gt;

&lt;p&gt;No need to manually write animation code for every icon.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it's built (for the curious)
&lt;/h2&gt;

&lt;p&gt;Every icon is defined in a single data file within a core package.&lt;/p&gt;

&lt;p&gt;Each file contains the icon's shapes and optional motion settings for individual shapes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;36 motion recipes&lt;/strong&gt;, including draw, swing, lift, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delay&lt;/strong&gt;, controlling when the animation begins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direction&lt;/strong&gt;, determining how elements move.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amplitude&lt;/strong&gt;, controlling the intensity of the motion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pivot points&lt;/strong&gt;, defining where a shape rotates or transforms on the 24×24 grid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A generator takes this single source and produces packages for all five supported frameworks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vue&lt;/li&gt;
&lt;li&gt;Svelte&lt;/li&gt;
&lt;li&gt;Jetpack Compose&lt;/li&gt;
&lt;li&gt;SwiftUI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Browser tests also run icons side by side in React, Vue, and Svelte to help verify that animations behave consistently across frameworks.&lt;/p&gt;
&lt;h3&gt;
  
  
  Open source on GitHub
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CityPulso" rel="noopener noreferrer"&gt;
        CityPulso
      &lt;/a&gt; / &lt;a href="https://github.com/CityPulso/PulsoIcon" rel="noopener noreferrer"&gt;
        PulsoIcon
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Animated React icons — every Lucide icon plus extra icons and brand logos, each with its own hand-written motion. Drop-in replacement for lucide-react, built on Motion.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/CityPulso/PulsoIcon/./logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FCityPulso%2FPulsoIcon%2FHEAD%2F.%2Flogo.png" alt="PulsoIcon" width="160"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;PulsoIcon&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;strong&gt;9955 animated icons. Every one has its own motion.&lt;/strong&gt;&lt;br&gt;
  For React, Vue, Svelte, Jetpack Compose and SwiftUI. Icons come alive on hover; in React they replace lucide-react in one line
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://www.npmjs.com/package/pulsoicon-react" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/389d6d55403aaab0a1fa4d78ae24ec13f953307ed8fc57ff2f1b911711df7227/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f70756c736f69636f6e2d72656163743f636f6c6f723d663235353263" alt="npm version"&gt;&lt;/a&gt;
  &lt;a href="https://www.npmjs.com/package/pulsoicon-react" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4893d50ae401aa72578977594bd0f0f36425a8c07d6fbdfcf14a006decde5188/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f70756c736f69636f6e2d72656163743f636f6c6f723d663235353263" alt="npm downloads"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/CityPulso/PulsoIcon/./LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b8eeed4deb305e6ab172886586d02bcb970b3bd723ba67bd0f97d13840266cde/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f6c2f70756c736f69636f6e2d72656163743f636f6c6f723d663235353263" alt="license"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://pulsoicon.com" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;pulsoicon.com&lt;/strong&gt;&lt;/a&gt;: browse all icons, try them live and copy the code ·
  &lt;a href="https://pulsoicon.com/playground" rel="nofollow noopener noreferrer"&gt;Playground&lt;/a&gt; ·
  &lt;a href="https://pulsoicon.com/docs" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;strong&gt;Docs:&lt;/strong&gt;
  &lt;a href="https://github.com/CityPulso/PulsoIcon/./packages/react/README.md" rel="noopener noreferrer"&gt;React&lt;/a&gt; ·
  &lt;a href="https://github.com/CityPulso/PulsoIcon/./packages/vue/README.md" rel="noopener noreferrer"&gt;Vue&lt;/a&gt; ·
  &lt;a href="https://github.com/CityPulso/PulsoIcon/./packages/svelte/README.md" rel="noopener noreferrer"&gt;Svelte&lt;/a&gt; ·
  &lt;a href="https://github.com/CityPulso/PulsoIcon/./kotlin/README.md" rel="noopener noreferrer"&gt;Android (Compose)&lt;/a&gt; ·
  &lt;a href="https://github.com/CityPulso/PulsoIcon/./swift/README.md" rel="noopener noreferrer"&gt;iOS / macOS (SwiftUI)&lt;/a&gt; ·
  &lt;a href="https://github.com/CityPulso/PulsoIcon/./packages/core/README.md" rel="noopener noreferrer"&gt;Core data&lt;/a&gt;
&lt;/p&gt;




&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/CityPulso/PulsoIcon/./PulsoIcon_README_Loop.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FCityPulso%2FPulsoIcon%2FHEAD%2F.%2FPulsoIcon_README_Loop.gif" alt="PulsoIcon icons animating on hover" width="720"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;A bell rings. A calendar lifts its rings. A trash can opens its lid. A clock's hand goes round.&lt;/p&gt;

&lt;p&gt;PulsoIcon gives every icon a motion written for that icon, not one effect stamped on all of them. At rest each icon is a clean 24×24 icon; it plays when someone hovers or focuses the button, link or tab it sits in.&lt;/p&gt;

&lt;p&gt;Every one of the 9955 motions is written for this set. About 3,700 icons are drawn here, including the line-art brand logos; the rest build…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CityPulso/PulsoIcon" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;The project is available under the &lt;strong&gt;ISC License&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current limitations
&lt;/h2&gt;

&lt;p&gt;There are a couple of things worth mentioning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web packages are the most polished.&lt;/strong&gt; React, Vue, and Svelte have received the most refinement. The Jetpack Compose and SwiftUI ports are newer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animation quality can vary.&lt;/strong&gt; With 9,955 individually tuned motions, some animations naturally feel better than others.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you find an icon whose animation feels unnatural or doesn't match its meaning, opening an issue with the specific icon name would be genuinely helpful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;If your UI already uses Lucide and feels more static than you'd like, PulsoIcon offers a straightforward way to introduce meaningful micro-interactions.&lt;/p&gt;

&lt;p&gt;For many React components, all it takes is changing one import statement.&lt;/p&gt;

&lt;p&gt;No complex animation setup. No manually defining hover effects for hundreds of icons.&lt;/p&gt;

&lt;p&gt;Just icons that respond to the interface around them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it yourself:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Playground:&lt;/strong&gt; &lt;a href="https://pulsoicon.com" rel="noopener noreferrer"&gt;https://pulsoicon.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/CityPulso/PulsoIcon" rel="noopener noreferrer"&gt;https://github.com/CityPulso/PulsoIcon&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I'd love your feedback
&lt;/h2&gt;

&lt;p&gt;Two things I'm especially interested in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Does the parent-hover animation model fit your workflow?&lt;/strong&gt; Would you prefer icons to animate automatically when hovering over their parent button, or would you rather control animation triggers manually?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Which icon animations feel wrong?&lt;/strong&gt; If you notice an animation that seems unnatural, distracting, or inconsistent with the icon's meaning, I'd love to know which one.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And if you try the playground, let me know which icon's animation is your favorite.&lt;/p&gt;

&lt;p&gt;Mine's the trash can. 🗑️&lt;/p&gt;

</description>
      <category>react</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
