ionic-design
Guide to using Ionic Framework components for beautiful native-looking Capacitor apps. Covers component usage, theming, platform-specific styling, and best practices for mobile UI. Use this skill when users need help with Ionic components or mobile UI design.
By cap-go · 1,356 installs
npx skills add cap-go/capgo-skills --skill ionic-design
Source repository · Upstream listing
Ionic Framework Design
When to Use
TRIGGER when:
Writing or reviewing Ion / ion components in a Capacitor app
Theming: ion color , dark mode, high contrast, per platform styles
iOS vs Material Design mode looks wrong, or mode overrides misbehave
Upgrading Ionic 7/8 9, or errors after npm i @ionic/ @latest
Choosing Ionic vs another UI kit for a new Capacitor app
Do not use:
Konsta UI components: konsta ui
Tailwind v4 install / config: tailwind capacitor
Notch / system bar padding outside Ionic: safe area handling
Keyboard covering inputs: capacitor keyboard (Ionic apps use resize: 'ionic' )
Leaving Appflow / Ionic Enterprise plugins: ionic appflow migration , ionic enterprise sdk migration
Versions (October 2026)
Package Current Notes
@ionic/core , @ionic/react , @ionic/vue , @ionic/angular 9.x ( latest ) 8.x on v8 lts tag
ionicons 8.x
Ionic 9 minimums Capacitor 7+, iOS 16+, Android Chromium 89+, Angular 18 22, React 18/19 + React Router 6.4+, Vue 3.5 + vue router 5, TypeScript 5.4+
Check installed versions first: npm ls @ionic/core @ionic/react @ionic/vue @ionic/angular . Write code for the installed major; do not mix v8 and v9 APIs.
Workflow
1. Inspect framework, Ionic major, router version, global CSS imports, setupIonicReact / IonicVue / provideIonicAngular config, capacitor.config Keyboard.resize .
2. Upgrading? Load [references/ionic 9 migration.md](references/ionic 9 migration.md); run npx @ionic/migrate in preview first, report findings, then apply.
3. Components : [references/components.md](references/components.md) for page shell, lists, forms, overlays, tabs.
4. Theming : [references/theming.md](references/theming.md) for colors, dark/high contrast palettes, mode specific CSS, shadow parts.
5. Verify in both modes and on devices (below).
Only load a reference when its topic is in play.
Rules that prevent most Ionic bugs
Every routed page = IonPage IonHeader + IonContent (+ optional IonFooter ). Missing IonPage breaks transitions and lifecycle hooks.
Scroll lives in ion content . Do not make body or a wrapper div scroll; use IonContent scrollToTop() / getScrollElement() .
Use ion router outlet ( IonRouterOutlet , IonTabs ) for URL routing. In Ionic 9 ion nav no longer integrates with ion router ; keep it for local URL less stacks inside a page.
Safe areas are handled through ion safe area top right bottom left (default env() ); do not add body padding on top. Requires viewport fit=cover .
Forms: put label + labelPlacement on the control itself ( <IonInput label="Email" labelPlacement="floating" / ). Legacy <IonItem <IonLabel/ <IonInput/ </IonItem labeling was removed in Ionic 8.
Overlays: prefer inline <IonModal isOpen / trigger or hooks ( useIonModal , modalController ) consistently; always handle didDismiss to reset state.
Platform: style via .ios / .md classes on html or mode CSS selectors; use isPlatform('ios') only for behavior, never navigator.userAgent .
Icons: import only used icons ( import { heart } from 'ionicons/icons' ) and pass icon={heart} ; string names need addIcons registration in standalone/bundled builds.
Verification
1. Build and sync: npm run build && npx cap sync .
2. Run both modes in the browser: append ?ionic:mode=ios and ?ionic:mode=md to the dev URL; check headers, toolbars, lists, buttons.
3. Toggle OS dark mode (or add ion palette dark to <html if using the class palette); check contrast of custom colors.
4. Device check: iPhone with Dynamic Island + Android 15/16 gesture nav for header/tab bar insets; open keyboard on a form page.
5. After upgrade: grep rn "ion picker legacy\ pickerController\ useIonPicker\ @ionic/angular/standalone\ autocorrect=\"off\"" src/ returns nothing; npx tsc noEmit passes.
Error Handling
Error / symptom Cause Fix
Package path ./dist/... is not exported from package (webpack) / ERR PACKAGE PATH NOT EXPORTED (Node) for @ionic/core Ionic 9 exports map; deep import Import from @ionic/core , @ionic/core/components , @ionic/core/components/ion .js , @ionic/core/loader , @ionic/core/css/ .css
Import errors or migrate warnings for @ionic/angular/standalone (Ionic 9) Standalone imports moved Import from @ionic/angular ; lazy APIs from @ionic/angular/lazy
React: Property 'component' does not exist on Route / IonRoute Ionic 9 requires React Router 6 element={<Page / } , Navigate instead of Redirect , useNavigate instead of useHistory
Autocorrect turned ON after upgrade autocorrect="off" string is truthy in Ionic 9 Remove the attribute or bind false
ionChange no longer fires on re selecting same option Ionic 9 fires only on value change Use ionDismiss for dismissal
Sheet modal handle now focusable / cycles breakpoints Ionic 9 handleBehavior default cycle handle behavior="none" to restore
Styles missing, components unstyled Core CSS not imported Import @ionic/<fw /css/core.css (+ structure/typography) once at entry
Dark mode never activates No palette imported Import css/palettes/dark.system.css (or .class.css + ion palette dark class)
Angular 21 view not updating after async work Zoneless default in Ionic 9 + Angular 21 Use signals / markForCheck() , or add provideZoneChangeDetection()
Resources
Ionic docs: https://ionicframework.com/docs
Ionic 9 breaking changes: https://github.com/ionic team/ionic framework/blob/main/BREAKING.md
Theming: https://ionicframework.com/docs/theming/basics
Dark mode: https://ionicframework.com/docs/theming/dark mode