skills/ionic-vue/SKILL.md
Guides the agent through Ionic Vue development patterns — project structure, Vue-specific Ionic components (IonPage, IonRouterOutlet, IonTabs), navigation with Vue Router and useIonRouter, Ionic lifecycle hooks (onIonViewWillEnter, onIonViewDidEnter, onIonViewWillLeave, onIonViewDidLeave), composable utilities (useIonRouter, useBackButton, useKeyboard), tab-based routing, lazy loading, platform detection with isPlatform, and troubleshooting common Vue-specific issues. Do not use for general Ionic component theming or CLI usage (use ionic-app-development), creating a new Ionic app (use ionic-app-creation), Capacitor-specific Vue patterns without Ionic (use capacitor-vue), upgrading Ionic versions (use ionic-app-upgrades), or non-Vue frameworks like Angular or React.
npx skillsauth add capawesome-team/skills ionic-vueInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Develop Ionic apps with Vue — project structure, components, navigation, lifecycle hooks, composables, and Vue-specific patterns.
@ionic/vue.package.json dependencies (@ionic/vue, vue, @capacitor/core), platforms (android/, ios/), build tools (vite.config.ts), and TypeScript usage. Only ask the user when something cannot be detected.<script setup> (Composition API) or Options API and generate code that matches the existing style. Default to <script setup lang="ts"> for new files unless the project uses a different pattern.Auto-detect the following by reading project files:
@ionic/vue version from package.json.vue version from package.json.@capacitor/core version from package.json (if present).tsconfig.json exists and if .vue files use <script setup lang="ts">.android/, ios/).src/router/index.ts).App.vue.A standard Ionic Vue project follows this structure:
project-root/
├── android/ # Android native project (generated by Capacitor)
├── ios/ # iOS native project (generated by Capacitor)
├── public/
├── src/
│ ├── components/ # Reusable Vue components
│ ├── composables/ # Custom composables
│ ├── router/
│ │ └── index.ts # Vue Router configuration (uses @ionic/vue-router)
│ ├── theme/
│ │ └── variables.css # Ionic CSS custom properties
│ ├── views/ # Page components (routed views)
│ ├── App.vue # Root component (contains IonApp + IonRouterOutlet)
│ └── main.ts # Entry point (installs IonicVue plugin)
├── capacitor.config.ts # Capacitor configuration
├── package.json
├── tsconfig.json
└── vite.config.ts
If the project does not follow this structure, adapt all guidance to the project's actual directory layout. Do not restructure the project unless the user explicitly asks.
The entry point src/main.ts installs the IonicVue plugin and mounts the app:
import { createApp } from 'vue';
import { IonicVue } from '@ionic/vue';
import App from './App.vue';
import router from './router';
/* Ionic CSS */
import '@ionic/vue/css/core.css';
import '@ionic/vue/css/normalize.css';
import '@ionic/vue/css/structure.css';
import '@ionic/vue/css/typography.css';
import '@ionic/vue/css/padding.css';
import '@ionic/vue/css/float-elements.css';
import '@ionic/vue/css/text-alignment.css';
import '@ionic/vue/css/text-transformation.css';
import '@ionic/vue/css/flex-utils.css';
import '@ionic/vue/css/display.css';
/* Theme */
import './theme/variables.css';
const app = createApp(App).use(IonicVue).use(router);
router.isReady().then(() => {
app.mount('#app');
});
The root App.vue contains IonApp and IonRouterOutlet:
<template>
<ion-app>
<ion-router-outlet />
</ion-app>
</template>
<script setup lang="ts">
import { IonApp, IonRouterOutlet } from '@ionic/vue';
</script>
Read references/components.md for detailed component patterns.
Key rules:
@ionic/vue — e.g., import { IonButton, IonContent, IonPage } from '@ionic/vue'.IonPage as its root template element. Without it, page transitions break and Ionic lifecycle hooks do not fire.$el — e.g., contentRef.value.$el.scrollToBottom(300).ionicons/icons — never pass icon names as strings.v-model on Ionic form components (IonInput, IonToggle, IonSelect, IonCheckbox, IonRange).@ion-change, @ion-infinite.Read references/navigation.md for detailed routing patterns.
Key principles:
createRouter from @ionic/vue-router, not from vue-router. The Ionic version wraps Vue Router to enable page transitions.router-link attribute on Ionic components with optional router-direction and router-animation.useIonRouter composable for Ionic-specific transitions, or useRouter from vue-router for standard navigation.component: () => import('@/views/DetailPage.vue').IonTabs and IonRouterOutlet. Each tab maintains its own navigation stack.IonModal for views shared across tabs.Read references/lifecycle.md for detailed lifecycle patterns.
Key principles:
IonRouterOutlet keeps pages in the DOM. Vue's onMounted fires only once per page, not on every visit.onIonViewWillEnter — Refresh data every time the page appears.onIonViewDidEnter — Start animations or focus inputs after the page transition finishes.onIonViewWillLeave — Save state or unsubscribe.onIonViewDidLeave — Clean up off-screen resources.IonPage as the root element.Read references/composables.md for detailed composable documentation.
Available composables and utilities from @ionic/vue:
| Function | Purpose |
|----------|---------|
| useIonRouter() | Programmatic navigation with transition control |
| useBackButton(priority, handler) | Handle Android hardware back button |
| useKeyboard() | Reactive keyboard visibility and height |
| onIonViewWillEnter(cb) | Lifecycle: page about to show |
| onIonViewDidEnter(cb) | Lifecycle: page fully visible |
| onIonViewWillLeave(cb) | Lifecycle: page about to hide |
| onIonViewDidLeave(cb) | Lifecycle: page fully hidden |
| isPlatform(name) | Check current platform (ios, android, hybrid, etc.) |
| getPlatforms() | Get array of all matching platform identifiers |
Use isPlatform from @ionic/vue to conditionally execute platform-specific logic:
<script setup lang="ts">
import { isPlatform } from '@ionic/vue';
const isIOS = isPlatform('ios');
const isAndroid = isPlatform('android');
const isNative = isPlatform('hybrid');
const isMobileWeb = isPlatform('mobileweb');
</script>
<template>
<div>
<p v-if="isNative">Running as a native app</p>
<p v-else>Running in a browser</p>
</div>
</template>
Supported identifiers: android, capacitor, cordova, desktop, electron, hybrid, ios, ipad, iphone, mobile, mobileweb, phablet, pwa, tablet.
After implementing changes:
npm run build
npx cap sync
npx cap run android
npx cap run ios
For development with live reload:
ionic serve
For native live reload:
ionic cap run android --livereload --external
ionic cap run ios --livereload --external
Failed to resolve component: ion-*: The Ionic component is not imported. Add the missing import from @ionic/vue in the <script> section (e.g., import { IonButton } from '@ionic/vue').IonPage as its root template element. Without IonPage, transitions and lifecycle hooks silently fail.IonPage is the root element and the component is directly mapped to a route in the router configuration. Lifecycle hooks do not fire on child components.Method on component is not a function: Access the underlying Web Component via $el — e.g., ref.value.$el.scrollToBottom(), not ref.value.scrollToBottom().'vue/no-deprecated-slot-attribute': 'off'.ion-modal-did-present) and in addEventListener calls. Do not use camelCase.useIonRouter or useBackButton fails: These composables use Vue's inject() internally and must be called inside setup() or <script setup>, not in standalone functions or callbacks.router.go() with non-linear (tab-based) routing. Use useIonRouter().push() or router-link instead.onMounted fires only once: IonRouterOutlet caches pages in the DOM. Use onIonViewWillEnter instead of onMounted for logic that must run every time the page is shown.IonPage as the root element. IonPage sets up the proper flexbox layout.ionic-app-development — General Ionic development guidance: components, theming, CLI usage.ionic-app-creation — Create a new Ionic app from scratch.capacitor-vue — Capacitor-specific Vue patterns (plugins, hooks, services) without Ionic Framework.ionic-app-upgrades — Upgrade Ionic Framework to a newer version.tools
Guides the agent through migrating Capacitor apps from discontinued Ionic Enterprise SDK plugins (Auth Connect, Identity Vault, Secure Storage) to their Capawesome alternatives (OAuth, Vault, Biometrics, Secure Preferences, SQLite). Covers dependency detection, side-by-side API mapping, code replacement, and platform-specific configuration for each plugin pair. Do not use for migrating Capacitor apps or plugins to a newer version, setting up Capawesome Cloud, or non-Capacitor mobile frameworks.
tools
Guides the agent through installing, configuring, and using Capacitor plugins from six sources — official Capacitor plugins, Capawesome plugins, Capacitor Community plugins, Capacitor Firebase plugins, Capacitor MLKit plugins, and RevenueCat plugins. Covers installation, platform-specific configuration (Android and iOS), and basic usage examples. Do not use for migrating Capacitor apps or plugins to a newer version, setting up Capacitor Live Updates, or non-Capacitor mobile frameworks.
development
Guides the agent through Ionic Framework development with React — project structure, React-specific Ionic components, IonReactRouter and navigation patterns, Ionic lifecycle hooks (useIonViewWillEnter, useIonViewDidEnter, useIonViewWillLeave, useIonViewDidLeave), state management integration, and React-specific best practices for Ionic apps. Do not use for plain Capacitor React apps without Ionic (use capacitor-react), Ionic with Angular or Vue, creating a new Ionic app (use ionic-app-creation), upgrading Ionic to a newer version (use ionic-app-upgrades), or general Ionic component usage without React-specific context (use ionic-app-development).
tools
A comprehensive starting point for AI agents to work with the Ionic Framework. Covers core concepts, components, CLI, theming, layout, lifecycle, navigation, and framework-specific patterns for Angular, React, and Vue. Pair with the other Ionic skills in this collection for deeper topic-specific guidance like app creation, framework integration, and upgrades.