<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[The Frontend Blog]]></title><description><![CDATA[The Frontend Blog]]></description><link>https://frontendblog.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6a551b920e81c59dde9dcfc2/d18db85d-25b2-4952-bbf5-d088d6373625.png</url><title>The Frontend Blog</title><link>https://frontendblog.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 30 Oct 2026 07:18:29 GMT</lastBuildDate><atom:link href="https://frontendblog.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Introducing GeoIcons: 420+ Tree-Shakable Geographic Icons for the Web]]></title><description><![CDATA[GeoIcons is a library of 422 country and region icons for React, Vue, Angular, and vanilla JS. Tree-shakeable named exports, accessible, dual-licensed]]></description><link>https://frontendblog.hashnode.dev/introducing-geoicons-420-tree-shakable-geographic-icons-for-the-web</link><guid isPermaLink="true">https://frontendblog.hashnode.dev/introducing-geoicons-420-tree-shakable-geographic-icons-for-the-web</guid><category><![CDATA[svg icons]]></category><category><![CDATA[Icons]]></category><category><![CDATA[geography]]></category><category><![CDATA[React]]></category><category><![CDATA[Angular]]></category><category><![CDATA[Vue.js]]></category><category><![CDATA[react components ]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Rushan]]></dc:creator><pubDate>Mon, 13 Jul 2026 17:37:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a551b920e81c59dde9dcfc2/5c535b32-e602-41ac-b3b5-e0bf41a872d0.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most icon libraries give you thousands of general-purpose glyphs and then stop right where geography starts. You get a globe and a map pin, and that's about it. If you're building a dashboard, a shipping tool, a travel app, or anything that lists places, you end up hunting down loose SVGs, pasting them inline, and hoping they line up with the rest of your UI.</p>
<p>GeoIcons fixes that one gap. It's a library of 422 (at the time of this post) geographic icons: 255 countries and 167 regions, continents, and unions like the EU. Every icon ships as a real component you import by name, not a sprite sheet or a font file you have to wire up.</p>
<h2>What you actually get</h2>
<p>422 icons, built from clean SVG artwork and optimized with SVGO. Each one is a named export. That's the whole point: you import the two icons your page needs, and your bundle carries two icons, not four hundred.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a551b920e81c59dde9dcfc2/2a15cd58-0854-4e8c-a6a5-096011da1340.png" alt="" style="display:block;margin:0 auto" />

<p>Here's a country and a region, side by side:</p>
<pre><code class="language-typescript">import { Us } from "@geoicons/react/countries";
import { EuropeanUnionEu } from "@geoicons/react/areas";

export default function Icons() {
  return (
    &lt;&gt;
      &lt;Us width={24} /&gt;
      &lt;EuropeanUnionEu width={24} /&gt;
    &lt;/&gt;
  );
}
</code></pre>
<p>Countries use their ISO alpha-2 code in PascalCase, so the United States is <code>Us</code> and Japan is <code>Jp</code>. Regions use a readable slug, like <code>EuropeanUnionEu</code>. No lookup table, no <code>&lt;Icon name="us" /&gt;</code> indirection that quietly pulls the entire set into your bundle.</p>
<h2>Works in your framework, not around it</h2>
<p>Same icons, four packages:</p>
<pre><code class="language-shell">npm install @geoicons/react
npm install @geoicons/vue
npm install @geoicons/angular
npm install @geoicons/vanilla
</code></pre>
<p>Vue and Angular get idiomatic components, not React wrappers in disguise. The vanilla package hands you a small function so you can drop icons into plain HTML without a build step. Whatever you're on, you import geography the same way you import a button.</p>
<h2>Accessibility isn't an afterthought</h2>
<p>Every icon renders an <code>aria-label</code> and a <code>&lt;title&gt;</code>, and each instance gets a unique ID so screen readers don't trip over duplicates when you render the same icon twice on a page. You don't configure any of that. It's how the components are built.</p>
<h2>Tree-shaking is the whole design</h2>
<img src="https://cdn.hashnode.com/uploads/covers/6a551b920e81c59dde9dcfc2/9fe331e1-92d1-4170-8f19-ab209d741579.png" alt="" style="display:block;margin:0 auto" />

<p>This is worth repeating because it's the reason the library exists in this shape. There is no central registry mapping names to components. Import <code>Jp</code> and your bundle gets <code>Jp</code>. Import nothing else and nothing else ships. For a place-heavy app that might reference dozens of countries across different routes, that adds up.</p>
<h2>The library is growing</h2>
<p>Today it's 255 countries and 167 regions. Flags and country subdivisions (states, provinces, and the like) are in the works, so the count keeps climbing. If there's a place or a set you need, that feedback shapes what lands next.</p>
<h2>Licensing, plainly</h2>
<p>GeoIcons is dual-licensed. GPLv3 for open-source work, a commercial license for closed-source products. Pick the one that matches your project. The icons always render the same either way. There's no crippled free tier and no locked icons, just two license options for two kinds of use.</p>
<h2>Try it</h2>
<p>Browse the full set and search by country or region at <a href="https://geoicons.io">geoicons.io</a>, then install the package for your framework and import the two icons your page needs.</p>
<p>That's the pitch: geography, done properly, as components.</p>
]]></content:encoded></item></channel></rss>