Ionic Framework Design Guide
Build beautiful, native-looking mobile apps with Ionic Framework and Capacitor.
When to Use This Skill User is using Ionic components User wants native-looking UI User asks about Ionic theming User needs mobile UI patterns User wants platform-specific styling What is Ionic Framework?
Ionic provides:
100+ mobile-optimized UI components Automatic iOS/Android platform styling Built-in dark mode support Accessibility out of the box Works with React, Vue, Angular, or vanilla JS Getting Started Installation
For React
bun create vite my-app --template react-ts cd my-app bun add @ionic/react @ionic/react-router
For Vue
bun create vite my-app --template vue-ts cd my-app bun add @ionic/vue @ionic/vue-router
Add Capacitor
bun add @capacitor/core @capacitor/cli bunx cap init
Setup (React) // main.tsx import React from 'react'; import { createRoot } from 'react-dom/client'; import { IonApp, setupIonicReact } from '@ionic/react'; import App from './App';
/ Core CSS required for Ionic components to work properly / import '@ionic/react/css/core.css';
/ Basic CSS for apps built with Ionic / import '@ionic/react/css/normalize.css'; import '@ionic/react/css/structure.css'; import '@ionic/react/css/typography.css';
/ Optional CSS utils / import '@ionic/react/css/padding.css'; import '@ionic/react/css/float-elements.css'; import '@ionic/react/css/text-alignment.css'; import '@ionic/react/css/text-transformation.css'; import '@ionic/react/css/flex-utils.css'; import '@ionic/react/css/display.css';
/ Theme / import './theme/variables.css';
setupIonicReact();
const root = createRoot(document.getElementById('root')!);
root.render(
Core Components Page Structure import { IonPage, IonHeader, IonToolbar, IonTitle, IonContent, IonButtons, IonBackButton, } from '@ionic/react';
function MyPage() {
return (
<IonContent fullscreen>
{/* Large title for iOS */}
<IonHeader collapse="condense">
<IonToolbar>
<IonTitle size="large">Page Title</IonTitle>
</IonToolbar>
</IonHeader>
{/* Page content */}
<div className="ion-padding">
Your content here
</div>
</IonContent>
</IonPage>
); }
Lists import { IonList, IonItem, IonLabel, IonNote, IonAvatar, IonIcon, IonItemSliding, IonItemOptions, IonItemOption, } from '@ionic/react'; import { chevronForward, trash, archive } from 'ionicons/icons';
function ContactList() {
return (
{/* Item with detail */}
<IonItem detail button>
<IonLabel>
<h2>Item Title</h2>
<p>Item description text</p>
</IonLabel>
<IonNote slot="end">Note</IonNote>
</IonItem>
{/* Item with avatar */}
<IonItem>
<IonAvatar slot="start">
<img src="/avatar.jpg" alt="" />
</IonAvatar>
<IonLabel>
<h2>John Doe</h2>
<p>john@example.com</p>
</IonLabel>
</IonItem>
{/* Sliding item */}
<IonItemSliding>
<IonItem>
<IonLabel>Swipe me</IonLabel>
</IonItem>
<IonItemOptions side="end">
<IonItemOption color="danger">
<IonIcon slot="icon-only" icon={trash} />
</IonItemOption>
<IonItemOption>
<IonIcon slot="icon-only" icon={archive} />
</IonItemOption>
</IonItemOptions>
</IonItemSliding>
</IonList>
); }
Forms import { IonInput, IonTextarea, IonSelect, IonSelectOption, IonToggle, IonCheckbox, IonRadioGroup, IonRadio, IonItem, IonLabel, IonButton, } from '@ionic/react';
function MyForm() { return (