Getting Started
A CSS/JS theme library that brings the iOS 27 Liquid Glass appearance and navigation animations to Ionic applications while preserving Ionic components and conventions.
[!IMPORTANT]
Thismainbranch contains the iOS 27 theme under the package name@rdlabo/ionic-theme-ios27. For the iOS 26 theme (@rdlabo/ionic-theme-ios26), see theios26branch.
All versions before 1.0.0 are release candidates (RC). APIs, CSS variables, classes, styling, and behavior may change without backward compatibility, including in minor and patch releases. A stable compatibility commitment starts with 1.0.0.
Installation
Requires @ionic/core 8.8.1 or later (Ionic 8 and 9). Install it in an existing Ionic project:
npm install @rdlabo/ionic-theme-ios27
And import the theme in your project's main CSS file (e.g., src/styles.scss).
@import '@rdlabo/ionic-theme-ios27/dist/css/default-variables.css';
@import '@rdlabo/ionic-theme-ios27/dist/css/ionic-theme-ios27.css';
/**
* Keep Material Design mode unaffected by the iOS theme
* when the same markup is used in both modes.
* Note: This stylesheet is not included in `@rdlabo/ionic-theme-md3`.
*/
@import '@rdlabo/ionic-theme-ios27/dist/css/md-remove-ios-class-effect.css';
/**
* If you will use the design of ion-item-group with ion-list on Android as well, import it.
* More info: https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/using-ion-item-group
* Note: This stylesheet is included in `@rdlabo/ionic-theme-md3`.
* @import '@rdlabo/ionic-theme-ios27/dist/css/md-ion-list-inset.css';
*/
/*
* Support Dark Mode
* We support Ionic Dark Mode. More information is here: https://ionicframework.com/docs/theming/dark-mode
* use Always: @import '@rdlabo/ionic-theme-ios27/dist/css/ionic-theme-ios27-dark-always.css'
* use System: @import '@rdlabo/ionic-theme-ios27/dist/css/ionic-theme-ios27-dark-system.css'
* use CSS Class: @import '@rdlabo/ionic-theme-ios27/dist/css/ionic-theme-ios27-dark-class.css'
*/
Configure animations
If you installed only the iOS 27 theme, configure its animations as follows.
import { isPlatform } from '@ionic/core'; // or @ionic/angular (Ionic 9), @ionic/angular/standalone (Ionic 8), @ionic/react, @ionic/vue
import { iosTransitionAnimation, popoverEnterAnimation, popoverLeaveAnimation } from '@rdlabo/ionic-theme-ios27';
// Angular
provideIonicAngular({
...
navAnimation: isPlatform('ios') ? iosTransitionAnimation: undefined,
popoverEnter: isPlatform('ios') ? popoverEnterAnimation: undefined,
popoverLeave: isPlatform('ios') ? popoverLeaveAnimation: undefined,
});
// React
setupIonicReact({
...
navAnimation: isPlatform('ios') ? iosTransitionAnimation: undefined,
popoverEnter: isPlatform('ios') ? popoverEnterAnimation: undefined,
popoverLeave: isPlatform('ios') ? popoverLeaveAnimation: undefined,
});
// Vue
createApp(App)
.use(IonicVue, {
...
navAnimation: isPlatform('ios') ? iosTransitionAnimation: undefined,
popoverEnter: isPlatform('ios') ? popoverEnterAnimation: undefined,
popoverLeave: isPlatform('ios') ? popoverLeaveAnimation: undefined,
})
Check the theme
Test on iOS. When previewing on desktop, set Ionic mode to ios in your existing framework initialization config (for example mode: 'ios').
Use this markup to preview the inset grouped list look. For the list structure the theme expects, see Using ion-item-group.
<ion-list mode="ios" inset="true">
<ion-item-group>
<ion-item><ion-label>Notifications</ion-label></ion-item>
<ion-item><ion-label>Appearance</ion-label></ion-item>
</ion-item-group>
</ion-list>
Optional: use the iOS 27 and MD3 themes together
Install the MD3 theme to style both Ionic modes from the same application.
The current releases of both themes require @ionic/core 8.8.1 or later.
npm install @rdlabo/ionic-theme-md3
When your global stylesheet uses Sass, initialize the themes in this order:
@use '@rdlabo/ionic-theme-ios27/src/styles/default-variables.scss' as ios27-vars;
@use '@rdlabo/ionic-theme-ios27/src/styles/ionic-theme-ios27.scss';
@use '@rdlabo/ionic-theme-ios27/src/styles/ionic-theme-ios27-dark-class.scss';
@use '@rdlabo/ionic-theme-ios27/src/styles/md-remove-ios-class-effect.scss';
@use '@rdlabo/ionic-theme-md3/dist/css/default-variables.css' as md3-vars;
@use '@rdlabo/ionic-theme-md3/dist/css/ionic-theme-md3.css';
The example uses Ionic's class-based dark mode. Your global stylesheet must also load Ionic's matching dark palette, such as @ionic/angular/css/palettes/dark.class.css for Angular. When using dark-system or dark-always, select the same variant for both Ionic's palette and the iOS 27 theme. See Ionic's Dark Mode documentation. The explicit ios27-vars and md3-vars namespaces prevent the two variable modules from using the same default namespace.
Configure both transition implementations when both themes are installed:
import { isPlatform } from '@ionic/core'; // or @ionic/angular (Ionic 9), @ionic/angular/standalone (Ionic 8), @ionic/react, @ionic/vue
import { iosTransitionAnimation, popoverEnterAnimation, popoverLeaveAnimation } from '@rdlabo/ionic-theme-ios27';
import { mdTransitionAnimation } from '@rdlabo/ionic-theme-md3';
// Angular
provideIonicAngular({
...
navAnimation: isPlatform('ios') ? iosTransitionAnimation : mdTransitionAnimation,
popoverEnter: isPlatform('ios') ? popoverEnterAnimation : undefined,
popoverLeave: isPlatform('ios') ? popoverLeaveAnimation : undefined,
});
// React
setupIonicReact({
...
navAnimation: isPlatform('ios') ? iosTransitionAnimation : mdTransitionAnimation,
popoverEnter: isPlatform('ios') ? popoverEnterAnimation : undefined,
popoverLeave: isPlatform('ios') ? popoverLeaveAnimation : undefined,
});
// Vue
createApp(App)
.use(IonicVue, {
...
navAnimation: isPlatform('ios') ? iosTransitionAnimation : mdTransitionAnimation,
popoverEnter: isPlatform('ios') ? popoverEnterAnimation : undefined,
popoverLeave: isPlatform('ios') ? popoverLeaveAnimation : undefined,
});
Documentation
Full documentation: Ionic Theme iOS27
- Adaptive iOS themes — conditionally load iOS 26 or iOS 27 styles.
- Using ion-item-group — required markup for inset lists.
- Special markup and classes — opt-in markup and utility classes used by the theme.
- ESLint — check list structure with ESLint rules.
- Features — CSS variables, Liquid Glass, selective imports, and dark mode.
- Experimental Animation — tab bar and searchable effects.
- Migration — stylesheet, class, and CSS variable naming changes.
- iOS 26 migration history — earlier major-version changes for the previous package.