Cross-Platform UI System

Ionicons Complete Guide: Modern Web, React, Vue & Mobile (2026)

Ionicons Cross-Platform Vector Architecture and Framework Integration
Ionicons cross-platform vector system: iOS-curved Outline, high-contrast Filled, and Android-angular Sharp variants with native framework wrappers.

1. Introduction: The Power of Cross-Platform Native Iconography

Building applications that simultaneously target mobile devices (via Capacitor, React Native, or PWAs) and responsive desktop browsers requires an icon system that respects conflicting operating system design conventions. While iOS interfaces emphasize smooth continuous fillets, subtle 1.5px/2px stroke outlines, and gentle tap feedback, Android Material Design favors bold, geometric silhouette fills and crisp sharp vertices.

Ionicons solves this fundamental design dichotomy by crafting every single concept into three synchronized, independent vector glyphs:

  1. Outline (-outline): Delicate 32px stroke-based outlines featuring circular corner joints, perfectly harmonizing with Apple HIG (Human Interface Guidelines).
  2. Filled (default): High-density solid silhouettes, ideal for active bottom-tab selections, pressed states, and primary callouts.
  3. Sharp (-sharp): Squared-off vector joints and unfilleted geometric boundaries tailored to Google's Material Design principles.

On IconStash, you can browse all 1,300+ vector paths in the Ionicons Library, copy clean SVG code directly, or export optimized React JSX components.

2. The Three Architectural Styles: Outline, Filled, and Sharp

Understanding the geometric differences between Ionicons styles is essential for creating cohesive design systems:

Outline Style -outline

Constructed on a 512x512 coordinate canvas with 32px standard stroke width, rounded line caps (stroke-linecap="round"), and rounded line joins (stroke-linejoin="round"). The default choice for modern, minimal iOS navigation.

Filled Style default

Solid filled silhouettes sharing identical outer contours with the Outline version. When toggling between unread and read status, or active and inactive sidebar links, switching to Filled preserves exact optical volume without shifting surrounding text.

Sharp Style -sharp

Features zero corner radii on interior and exterior joints (stroke-linejoin="miter"). Designed specifically to match the architectural feel of Android Material UI components and brutalist web aesthetics.

3. Interactive Tri-Style Icon Switcher & Code Generator

Toggle between the three Ionicons variants below to inspect their underlying vector geometry in real time. Notice how the stroke joints and fills adapt, and view the live-generated React, Angular, and HTML code snippets:

Live Ionicons Vector Sandbox
Heart heart-outline
Settings settings-outline
Notifications notifications-outline
Person person-outline
// Live Generated React Import (ionicons/icons) import { IonIcon } from '@ionic/react'; import { heartOutline, settingsOutline, notificationsOutline, personOutline } from 'ionicons/icons'; export function NavigationTabs() { return ( <div className="flex gap-4 items-center text-zinc-100"> <IonIcon icon={heartOutline} size="large" /> <IonIcon icon={settingsOutline} size="large" /> <IonIcon icon={notificationsOutline} size="large" /> <IonIcon icon={personOutline} size="large" /> </div> ); }

4. Vanilla HTML & Web Components: The <ion-icon> Custom Element

Ionicons was engineered from day one around the W3C Web Components standard. The custom element <ion-icon> uses Shadow DOM to fetch and render raw SVGs asynchronously on demand. This provides automatic lazy loading, ensuring that only the SVGs actually visible in the DOM are downloaded over the network.

<!-- Include Ionicons Web Component Runtime via CDN -->
<script type="module" src="https://unpkg.com/[email protected]/dist/ionicons/ionicons.esm.js"></script>
<script nomodule src="https://unpkg.com/[email protected]/dist/ionicons/ionicons.js"></script>

<!-- Render icons by string name -->
<ion-icon name="heart-outline" style="font-size: 24px; color: #C1DD2D;"></ion-icon>
<ion-icon name="settings-sharp" size="large"></ion-icon>

<!-- Platform-Adaptive Mode: iOS renders outline, Android renders sharp -->
<ion-icon ios="heart-outline" md="heart-sharp"></ion-icon>

The size attribute accepts "small" (16px) or "large" (32px), while standard sizing is driven directly through CSS font-size and color via color (which inherits currentColor).

5. React & Next.js 15 Integration: Subpath Tree-Shaking

In React and Next.js applications, passing raw string names to web components can cause hydration mismatches in Server-Side Rendering (SSR). Instead, use the official React wrapper @ionic/react with direct subpath imports from ionicons/icons:

// 1. Install dependencies
// npm install @ionic/react ionicons

import React from 'react';
import { IonIcon } from '@ionic/react';
// Direct subpath import guarantees 100% tree-shaking
import { 
  homeOutline, 
  home, 
  analyticsOutline, 
  settingsOutline 
} from 'ionicons/icons';

interface SidebarItemProps {
  label: string;
  icon: string;
  activeIcon: string;
  isActive: boolean;
}

export function SidebarItem({ label, icon, activeIcon, isActive }: SidebarItemProps) {
  return (
    <a className={`flex items-center gap-3 px-4 py-2.5 rounded-lg text-sm font-medium transition-colors ${
      isActive ? 'bg-zinc-800 text-lime-400' : 'text-zinc-400 hover:text-white'
    }`}>
      <IonIcon 
        icon={isActive ? activeIcon : icon} 
        style={{ fontSize: '20px' }} 
        aria-hidden="true" 
      />
      <span>{label}</span>
    </a>
  );
}

6. Angular Modern Architecture: Standalone Components & addIcons()

Modern Angular (v17+) uses Standalone Components and strict signal-based reactivity. Ionicons provides the optimized addIcons() registry pattern to prevent bloat in enterprise Angular production bundles:

// app-header.component.ts
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { IonHeader, IonToolbar, IonTitle, IonButtons, IonButton, IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { heartOutline, settingsSharp, personOutline } from 'ionicons/icons';

@Component({
  selector: 'app-header',
  standalone: true,
  imports: [CommonModule, IonHeader, IonToolbar, IonTitle, IonButtons, IonButton, IonIcon],
  template: `
    <ion-header>
      <ion-toolbar>
        <ion-title>Enterprise Dashboard</ion-title>
        <ion-buttons slot="end">
          <ion-button aria-label="Favorites">
            <ion-icon name="heart-outline"></ion-icon>
          </ion-button>
          <ion-button aria-label="Settings">
            <ion-icon name="settings-sharp"></ion-icon>
          </ion-button>
        </ion-buttons>
      </ion-toolbar>
    </ion-header>
  `
})
export class AppHeaderComponent {
  constructor() {
    // Explicit registration guarantees exact Rollup tree-shaking
    addIcons({
      'heart-outline': heartOutline,
      'settings-sharp': settingsSharp,
      'person-outline': personOutline
    });
  }
}

7. Vue 3 Integration: Composition API & Vite Optimization

For Vue 3 and Nuxt 3 applications, Ionicons integrates seamlessly with the Composition API:

<!-- components/NavBar.vue -->
<template>
  <nav class="nav-container">
    <button @click="toggleActive" class="icon-btn" aria-label="Bookmark">
      <ion-icon :icon="isActive ? bookmark : bookmarkOutline" class="nav-icon"></ion-icon>
    </button>
  </nav>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import { IonIcon } from '@ionic/vue';
import { bookmarkOutline, bookmark } from 'ionicons/icons';

const isActive = ref(false);
const toggleActive = () => {
  isActive.value = !isActive.value;
};
</script>

<style scoped>
.nav-icon {
  font-size: 24px;
  color: #C1DD2D;
  transition: transform 150ms ease;
}
.nav-icon:hover {
  transform: scale(1.1);
}
</style>

8. Mobile Cross-Platform Workflows: Capacitor, iOS & Android Adaptation

When developing mobile apps using Capacitor or React Native, displaying platform-authentic iconography significantly improves user satisfaction and App Store review ratings. Apple users expect thin, rounded outlines, while Android users expect geometric Material fills.

Ionicons provides automated platform detection out of the box. By setting both the ios and md attributes on any <ion-icon>, the component inspects navigator.userAgent (or the Capacitor device platform bridge) and dynamically selects the correct visual treatment:

<!-- Automatically serves heart-outline on iOS and heart-sharp on Android -->
<ion-icon ios="heart-outline" md="heart-sharp"></ion-icon>

<!-- Automatically serves share-outline on iOS and share-social-sharp on Android -->
<ion-icon ios="share-outline" md="share-social-sharp"></ion-icon>

9. Comprehensive Library Benchmark Comparison

Here is how Ionicons measures up against other top-tier icon systems in 2026:

Feature Ionicons Lucide Icons Material Symbols Font Awesome 6
Total Icon Count 1,300+ icons 1,500+ icons 3,300+ glyphs 2,000+ free
Visual Styles Outline, Filled, Sharp Clean Outline Outlined, Rounded, Sharp Solid, Regular, Brands
Weekly NPM Downloads ~800,000+ ~2,500,000+ ~400,000+ ~2,000,000+
Primary Grid Size 512x512 (scaled to 24px) 24x24 (2px stroke) 24x24 / 20x20 16x16 / 32x32
License MIT MIT Apache 2.0 CC BY 4.0 / SIL OFL
Best Fit Use-Case Mobile apps, Capacitor, PWAs, Angular/React Next.js, Tailwind, shadcn/ui web dashboards Google Material Design 3, Android, Cloud General web development & legacy CMS

Frequently Asked Questions

What makes Ionicons distinct from other open-source icon libraries?

Ionicons is specifically architected for cross-platform hybrid and web applications. Every icon is handcrafted in three distinct visual styles: Outline (iOS aesthetic with smooth rounded strokes), Filled (active and solid state), and Sharp (Android Material Design aesthetic with crisp 90-degree square vertices). Additionally, Ionicons natively powers the custom HTML element <ion-icon> that automatically switches glyphs based on device operating system.

How does tree-shaking work with Ionicons in React and Next.js?

Tree-shaking in React is achieved by importing specific named icon objects directly from the subpath 'ionicons/icons' (e.g., import { heartOutline, settingsSharp } from 'ionicons/icons') and passing them to <IonIcon icon={heartOutline} />. This bundles only the minimal SVG string representation for the referenced glyphs, resulting in zero unused bundle bloat.

How are icons registered in modern Angular standalone components?

In modern Angular (v17+ standalone components), icons are registered using the addIcons() utility imported from 'ionicons'. Inside the component constructor or route initializer, call addIcons({ 'heart-outline': heartOutline }), and reference it in the template as <ion-icon name='heart-outline'></ion-icon>. This ensures strict static analysis and tree-shaking.

Can I use Ionicons in standard HTML or websites without Ionic Framework?

Yes. Ionicons is completely decoupled from Ionic Framework. You can include the standalone Web Component runtime via CDN using <script type='module' src='https://unpkg.com/[email protected]/dist/ionicons/ionicons.esm.js'></script> and immediately drop <ion-icon name='heart-outline'></ion-icon> into any vanilla HTML, WordPress, Astro, or static site.

What license governs Ionicons and can I use it in commercial apps?

Ionicons is 100% free and open-source under the MIT License. You can use it in commercial SaaS applications, proprietary iOS and Android mobile apps, commercial themes, and enterprise software without any royalty payments or licensing restrictions.

Where can I search, preview, and copy Ionicons SVGs for free?

You can search and preview all 1,300+ Ionicons directly on IconStash at https://iconstash.io/library/ionicons/. IconStash provides instant full-text search, style filtering (Outline, Filled, Sharp), and one-click copy to clean SVG or React JSX components.

Search 134,701 Icons Across 28 Libraries

Zero paywalls, zero login, zero subscription fees. Find the perfect SVG vector icon in seconds on IconStash.

Start Searching Free →