@rdlabo/ionic-theme-ios27 1.2.1-beta.pr275.shad339e7688db7 → 2.0.0-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -280
- package/dist/css/components/ion-toolbar.css +1 -1
- package/dist/css/ionic-theme-ios27.css +1 -1
- package/dist/css/vertical-bars.css +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/layout/index.d.ts +18 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +26 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/segment/index.js +3 -3
- package/dist/segment/index.js.map +1 -1
- package/dist/sheets-of-glass/index.js +7 -7
- package/dist/sheets-of-glass/index.js.map +1 -1
- package/dist/tab-bar-searchable/dismiss-button.js +53 -3
- package/dist/tab-bar-searchable/dismiss-button.js.map +1 -1
- package/dist/tab-bar-searchable/index.js +18 -3
- package/dist/tab-bar-searchable/index.js.map +1 -1
- package/dist/transition/ios.transition.d.ts.map +1 -1
- package/dist/transition/ios.transition.js +7 -4
- package/dist/transition/ios.transition.js.map +1 -1
- package/dist/transition/native-ui.d.ts +6 -0
- package/dist/transition/native-ui.d.ts.map +1 -0
- package/dist/{native-integration/index.js → transition/native-ui.js} +16 -30
- package/dist/transition/native-ui.js.map +1 -0
- package/docs/adaptive-themes.md +161 -0
- package/docs/add-native-ui.md +53 -0
- package/docs/animation.md +19 -3
- package/docs/eslint.md +3 -1
- package/docs/features.md +9 -5
- package/docs/iphone-duo.md +62 -35
- package/docs/migration.md +17 -26
- package/docs/setup.md +92 -0
- package/docs/special-markup.md +41 -10
- package/docs/using-ion-item-group.md +2 -2
- package/docs/vertical-bars-layout.md +67 -0
- package/package.json +12 -42
- package/src/index.ts +3 -1
- package/src/layout/index.ts +29 -0
- package/src/segment/index.ts +3 -3
- package/src/sheets-of-glass/index.ts +7 -7
- package/src/styles/components/ion-toolbar.scss +1 -1
- package/src/styles/vertical-bars.scss +15 -18
- package/src/tab-bar-searchable/dismiss-button.ts +73 -4
- package/src/tab-bar-searchable/index.ts +20 -3
- package/src/transition/ios.transition.ts +7 -4
- package/src/{native-integration/index.ts → transition/native-ui.ts} +17 -46
- package/Package.swift +0 -21
- package/dist/_virtual/_rolldown/runtime.js +0 -13
- package/dist/native/components/index.d.ts +0 -19
- package/dist/native/components/index.d.ts.map +0 -1
- package/dist/native/components/index.js +0 -40
- package/dist/native/components/index.js.map +0 -1
- package/dist/native/components/ion-back-button.d.ts +0 -9
- package/dist/native/components/ion-back-button.d.ts.map +0 -1
- package/dist/native/components/ion-back-button.js +0 -20
- package/dist/native/components/ion-back-button.js.map +0 -1
- package/dist/native/components/ion-button.d.ts +0 -10
- package/dist/native/components/ion-button.d.ts.map +0 -1
- package/dist/native/components/ion-button.js +0 -23
- package/dist/native/components/ion-button.js.map +0 -1
- package/dist/native/components/ion-buttons.d.ts +0 -11
- package/dist/native/components/ion-buttons.d.ts.map +0 -1
- package/dist/native/components/ion-buttons.js +0 -30
- package/dist/native/components/ion-buttons.js.map +0 -1
- package/dist/native/components/ion-fab.d.ts +0 -10
- package/dist/native/components/ion-fab.d.ts.map +0 -1
- package/dist/native/components/ion-fab.js +0 -132
- package/dist/native/components/ion-fab.js.map +0 -1
- package/dist/native/components/ion-menu-button.d.ts +0 -13
- package/dist/native/components/ion-menu-button.d.ts.map +0 -1
- package/dist/native/components/ion-menu-button.js +0 -31
- package/dist/native/components/ion-menu-button.js.map +0 -1
- package/dist/native/components/ion-segment.d.ts +0 -11
- package/dist/native/components/ion-segment.d.ts.map +0 -1
- package/dist/native/components/ion-segment.js +0 -30
- package/dist/native/components/ion-segment.js.map +0 -1
- package/dist/native/components/ion-tab-bar.d.ts +0 -11
- package/dist/native/components/ion-tab-bar.d.ts.map +0 -1
- package/dist/native/components/ion-tab-bar.js +0 -50
- package/dist/native/components/ion-tab-bar.js.map +0 -1
- package/dist/native/components/searchable-tabs.d.ts +0 -20
- package/dist/native/components/searchable-tabs.d.ts.map +0 -1
- package/dist/native/components/searchable-tabs.js +0 -383
- package/dist/native/components/searchable-tabs.js.map +0 -1
- package/dist/native/definitions.d.ts +0 -191
- package/dist/native/definitions.d.ts.map +0 -1
- package/dist/native/definitions.js +0 -0
- package/dist/native/foldable/fold-state.d.ts +0 -5
- package/dist/native/foldable/fold-state.d.ts.map +0 -1
- package/dist/native/foldable/fold-state.js +0 -14
- package/dist/native/foldable/fold-state.js.map +0 -1
- package/dist/native/foldable/types.d.ts +0 -12
- package/dist/native/foldable/types.d.ts.map +0 -1
- package/dist/native/foldable/types.js +0 -0
- package/dist/native/index.d.ts +0 -11
- package/dist/native/index.d.ts.map +0 -1
- package/dist/native/index.js +0 -267
- package/dist/native/index.js.map +0 -1
- package/dist/native/overlays/content.d.ts +0 -4
- package/dist/native/overlays/content.d.ts.map +0 -1
- package/dist/native/overlays/content.js +0 -51
- package/dist/native/overlays/content.js.map +0 -1
- package/dist/native/overlays/controller.d.ts +0 -8
- package/dist/native/overlays/controller.d.ts.map +0 -1
- package/dist/native/overlays/controller.js +0 -285
- package/dist/native/overlays/controller.js.map +0 -1
- package/dist/native/overlays/dialog-animation.d.ts +0 -9
- package/dist/native/overlays/dialog-animation.d.ts.map +0 -1
- package/dist/native/overlays/dialog-animation.js +0 -53
- package/dist/native/overlays/dialog-animation.js.map +0 -1
- package/dist/native/overlays/dismiss-animation.d.ts +0 -4
- package/dist/native/overlays/dismiss-animation.d.ts.map +0 -1
- package/dist/native/overlays/dismiss-animation.js +0 -18
- package/dist/native/overlays/dismiss-animation.js.map +0 -1
- package/dist/native/overlays/focus.d.ts +0 -5
- package/dist/native/overlays/focus.d.ts.map +0 -1
- package/dist/native/overlays/focus.js +0 -59
- package/dist/native/overlays/focus.js.map +0 -1
- package/dist/native/overlays/popover.d.ts +0 -12
- package/dist/native/overlays/popover.d.ts.map +0 -1
- package/dist/native/overlays/popover.js +0 -110
- package/dist/native/overlays/popover.js.map +0 -1
- package/dist/native/overlays/styles.d.ts +0 -11
- package/dist/native/overlays/styles.d.ts.map +0 -1
- package/dist/native/overlays/styles.js +0 -167
- package/dist/native/overlays/styles.js.map +0 -1
- package/dist/native/prehide.d.ts +0 -7
- package/dist/native/prehide.d.ts.map +0 -1
- package/dist/native/prehide.js +0 -230
- package/dist/native/prehide.js.map +0 -1
- package/dist/native/runtime.d.ts +0 -7
- package/dist/native/runtime.d.ts.map +0 -1
- package/dist/native/runtime.js +0 -710
- package/dist/native/runtime.js.map +0 -1
- package/dist/native/shared/bridge.d.ts +0 -6
- package/dist/native/shared/bridge.d.ts.map +0 -1
- package/dist/native/shared/bridge.js +0 -18
- package/dist/native/shared/bridge.js.map +0 -1
- package/dist/native/shared/candidate.d.ts +0 -21
- package/dist/native/shared/candidate.d.ts.map +0 -1
- package/dist/native/shared/candidate.js +0 -98
- package/dist/native/shared/candidate.js.map +0 -1
- package/dist/native/shared/crossfade.d.ts +0 -12
- package/dist/native/shared/crossfade.d.ts.map +0 -1
- package/dist/native/shared/crossfade.js +0 -67
- package/dist/native/shared/crossfade.js.map +0 -1
- package/dist/native/shared/dom.d.ts +0 -46
- package/dist/native/shared/dom.d.ts.map +0 -1
- package/dist/native/shared/dom.js +0 -172
- package/dist/native/shared/dom.js.map +0 -1
- package/dist/native/shared/events.d.ts +0 -11
- package/dist/native/shared/events.d.ts.map +0 -1
- package/dist/native/shared/events.js +0 -13
- package/dist/native/shared/events.js.map +0 -1
- package/dist/native/shared/icons.d.ts +0 -8
- package/dist/native/shared/icons.d.ts.map +0 -1
- package/dist/native/shared/icons.js +0 -61
- package/dist/native/shared/icons.js.map +0 -1
- package/dist/native/shared/modal.d.ts +0 -10
- package/dist/native/shared/modal.d.ts.map +0 -1
- package/dist/native/shared/modal.js +0 -160
- package/dist/native/shared/modal.js.map +0 -1
- package/dist/native/shared/projection-id.d.ts +0 -4
- package/dist/native/shared/projection-id.d.ts.map +0 -1
- package/dist/native/shared/projection-id.js +0 -7
- package/dist/native/shared/projection-id.js.map +0 -1
- package/dist/native/shared/vertical-bars-geometry.d.ts +0 -10
- package/dist/native/shared/vertical-bars-geometry.d.ts.map +0 -1
- package/dist/native/shared/vertical-bars-geometry.js +0 -85
- package/dist/native/shared/vertical-bars-geometry.js.map +0 -1
- package/dist/native/vertical-bars-web-search.d.ts +0 -10
- package/dist/native/vertical-bars-web-search.d.ts.map +0 -1
- package/dist/native/vertical-bars-web-search.js +0 -90
- package/dist/native/vertical-bars-web-search.js.map +0 -1
- package/dist/native/vertical-bars-web.d.ts +0 -5
- package/dist/native/vertical-bars-web.d.ts.map +0 -1
- package/dist/native/vertical-bars-web.js +0 -411
- package/dist/native/vertical-bars-web.js.map +0 -1
- package/dist/native-integration/index.d.ts +0 -23
- package/dist/native-integration/index.d.ts.map +0 -1
- package/dist/native-integration/index.js.map +0 -1
- package/dist/native-integration/transition.d.ts +0 -5
- package/dist/native-integration/transition.d.ts.map +0 -1
- package/dist/native-integration/transition.js +0 -16
- package/dist/native-integration/transition.js.map +0 -1
- package/dist/vertical-bars.d.ts +0 -5
- package/dist/vertical-bars.js +0 -4
- package/docs/e2e-testing.md +0 -51
- package/docs/feedback.md +0 -65
- package/docs/iphone-duo-with-original-theme.md +0 -158
- package/docs/native-ui-shell.md +0 -325
- package/docs/vertical-bars.md +0 -300
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellButton.swift +0 -71
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellButtons.swift +0 -24
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellComponents.swift +0 -18
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellFab.swift +0 -80
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellSearchController.swift +0 -432
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellSegment.swift +0 -91
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellTabBar.swift +0 -218
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift +0 -565
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalSearch.swift +0 -118
- package/ios/Sources/IonicNativeUIShellPlugin/IonicNativeUIShellPlugin.swift +0 -502
- package/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayController.swift +0 -119
- package/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayHost.swift +0 -75
- package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellCrossfade.swift +0 -35
- package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellHost.swift +0 -8
- package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellRendering.swift +0 -27
- package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellSnapshot.swift +0 -135
- package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellVerticalBarsGeometry.swift +0 -52
- package/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift +0 -788
- package/src/native/components/index.ts +0 -53
- package/src/native/components/ion-back-button.ts +0 -19
- package/src/native/components/ion-button.ts +0 -24
- package/src/native/components/ion-buttons.ts +0 -38
- package/src/native/components/ion-fab.ts +0 -151
- package/src/native/components/ion-menu-button.ts +0 -24
- package/src/native/components/ion-segment.ts +0 -27
- package/src/native/components/ion-tab-bar.ts +0 -50
- package/src/native/components/searchable-tabs.ts +0 -459
- package/src/native/definitions.ts +0 -218
- package/src/native/foldable/fold-state.ts +0 -9
- package/src/native/foldable/types.ts +0 -4
- package/src/native/index.ts +0 -315
- package/src/native/overlays/content.ts +0 -51
- package/src/native/overlays/controller.ts +0 -349
- package/src/native/overlays/dialog-animation.ts +0 -53
- package/src/native/overlays/dismiss-animation.ts +0 -15
- package/src/native/overlays/focus.ts +0 -64
- package/src/native/overlays/popover.ts +0 -120
- package/src/native/overlays/styles.ts +0 -181
- package/src/native/prehide.ts +0 -265
- package/src/native/runtime.ts +0 -885
- package/src/native/shared/bridge.ts +0 -18
- package/src/native/shared/candidate.ts +0 -150
- package/src/native/shared/crossfade.ts +0 -67
- package/src/native/shared/dom.ts +0 -286
- package/src/native/shared/events.ts +0 -8
- package/src/native/shared/icons.ts +0 -57
- package/src/native/shared/modal.ts +0 -157
- package/src/native/shared/projection-id.ts +0 -2
- package/src/native/shared/vertical-bars-geometry.ts +0 -80
- package/src/native/vertical-bars-web-search.ts +0 -86
- package/src/native/vertical-bars-web.ts +0 -485
- package/src/native-integration/transition.ts +0 -15
- package/src/vertical-bars.ts +0 -11
package/README.md
CHANGED
|
@@ -1,298 +1,42 @@
|
|
|
1
1
|
# Ionic Theme iOS27
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Install with `npm install @rdlabo/ionic-theme-ios27`. For 1.x, use the [v1.2.1 guide](https://github.com/rdlabo-dev/ionic-theme-ios27/tree/ios27-v1.2.1).
|
|
4
|
+
A theme for Ionic apps that brings iOS 27 Liquid Glass and motion to the Web. Capacitor iOS apps can also opt into a preview Native UI for supported controls.
|
|
4
5
|
|
|
5
|
-
**[Ionic 9 demo](https://ionic-theme-ios27.rdlabo.dev/) · [Ionic 8 demo](https://ionic8-theme-ios27.rdlabo.dev/) · [
|
|
6
|
+
**[Ionic 9 demo](https://ionic-theme-ios27.rdlabo.dev/) · [Ionic 8 demo](https://ionic8-theme-ios27.rdlabo.dev/) · [Setup guide](docs/setup.md)**
|
|
6
7
|
|
|
7
8
|
<!-- rdlabo-docs-pick -->
|
|
8
9
|
|
|
9
10
|
<p>
|
|
10
|
-
<img src="
|
|
11
|
-
<img src="
|
|
12
|
-
<img src="
|
|
11
|
+
<img src="https://raw.githubusercontent.com/rdlabo-dev/ionic-theme-ios27/main/screenshots/ios27-settings.png" width="32%" alt="iOS 27 theme: Settings in light mode with a Liquid Glass search bar" />
|
|
12
|
+
<img src="https://raw.githubusercontent.com/rdlabo-dev/ionic-theme-ios27/main/screenshots/ios27-settings-dark.png" width="32%" alt="iOS 27 theme: Settings in dark mode" />
|
|
13
|
+
<img src="https://raw.githubusercontent.com/rdlabo-dev/ionic-theme-ios27/main/screenshots/ios27-library.png" width="32%" alt="iOS 27 theme: Library with Liquid Glass buttons and tab bar" />
|
|
13
14
|
</p>
|
|
14
15
|
|
|
15
16
|
<!-- /rdlabo-docs-pick -->
|
|
16
17
|
|
|
17
|
-
##
|
|
18
|
+
## What would you like to do?
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
**Tab drag on iOS 27:** The same Library screen with Native UI Shell off (Web) and on (UIKit). Both frames were captured while dragging the selected tab; the lower panels enlarge the glass around the tab bar.
|
|
28
|
-
|
|
29
|
-
[](./screenshots/native-ui-shell-drag/comparison.png)
|
|
30
|
-
|
|
31
|
-
### Follow the user's device
|
|
32
|
-
|
|
33
|
-
Pair the iOS 26 and iOS 27 themes so supported Safari versions can present the design of each generation: the iOS 26 look for iOS 26 users and the iOS 27 look for iOS 27 users. The [default setup](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/readme#get-started) uses browser feature checks to select the corresponding **styles**; it does not read the iOS version. When both packages are installed, keep the **page transition** on the iOS 27 animation. On even earlier iOS versions, Ionic's default iOS appearance remains when Safari supports neither feature. In a Capacitor iOS app, Native UI Shell's UIKit material follows the installed iOS version.
|
|
20
|
+
| Goal | Guide |
|
|
21
|
+
| ----------------------------------------------------- | -------------------------------------------------------------------------------- |
|
|
22
|
+
| Style an existing Ionic app | [Get started](docs/setup.md) |
|
|
23
|
+
| Select iOS 26/27 styles and optionally use MD3 | [Adaptive themes](docs/adaptive-themes.md) |
|
|
24
|
+
| Add native iOS controls after setting up the theme | [Add Native UI](docs/add-native-ui.md) |
|
|
25
|
+
| Add a side rail to Ionic while keeping your own theme | [Vertical Bars step by step](../capacitor-native-ui/docs/ionic-vertical-bars.md) |
|
|
26
|
+
| Upgrade an existing installation | [Migration](docs/migration.md) |
|
|
34
27
|
|
|
35
28
|
## Get started
|
|
36
29
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
npm install @rdlabo/ionic-theme-ios26 @rdlabo/ionic-theme-ios27
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
In your global Sass stylesheet (for example, `src/styles.scss`), load the styles by browser capability:
|
|
44
|
-
|
|
45
|
-
```scss
|
|
46
|
-
@use 'sass:meta';
|
|
47
|
-
|
|
48
|
-
@supports (overflow-anchor: auto) {
|
|
49
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios27/src/styles/default-variables');
|
|
50
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios27/src/styles/ionic-theme-ios27');
|
|
51
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios27/src/styles/ionic-theme-ios27-dark-class');
|
|
52
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios27/src/styles/md-remove-ios-class-effect');
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
@supports (text-wrap: pretty) and (not (overflow-anchor: auto)) {
|
|
56
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios26/src/styles/default-variables');
|
|
57
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios26/src/styles/ionic-theme-ios26');
|
|
58
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios26/src/styles/ionic-theme-ios26-dark-class');
|
|
59
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios26/src/styles/md-remove-ios-class-effect');
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
If compilation reports `Can't find stylesheet to import.` for a `meta.load-css()` call, make `node_modules` available to Sass. In Angular, add this under the app's build `options` in `angular.json`:
|
|
64
|
-
|
|
65
|
-
```json
|
|
66
|
-
"stylePreprocessorOptions": {
|
|
67
|
-
"includePaths": ["node_modules"]
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
Alternatively, use a relative path from the Sass file containing `meta.load-css()` to the installed package, such as `../node_modules/@rdlabo/ionic-theme-ios27/src/styles/default-variables` from `src/styles.scss`. Adjust the `../` prefix for your file's location, and apply the same change to each theme import.
|
|
72
|
-
|
|
73
|
-
These checks select styles by browser features, not by iOS version. Browsers without either feature retain Ionic's default iOS appearance. The example uses class-based dark mode: also load [Ionic's matching dark palette](https://ionicframework.com/docs/theming/dark-mode). For system or always-dark mode, replace both `-dark-class` imports with the matching variant. The `md-remove-ios-class-effect` styles prevent iOS-specific classes from affecting Material Design mode.
|
|
74
|
-
|
|
75
|
-
### Configure animations
|
|
76
|
-
|
|
77
|
-
Keep the iOS 27 page transition and popover animations for both styled generations. Resolve these options before Ionic initializes. For Angular:
|
|
78
|
-
|
|
79
|
-
```ts
|
|
80
|
-
import { isPlatform, provideIonicAngular } from '@ionic/angular/standalone'; // Ionic 8
|
|
81
|
-
import { iosTransitionAnimation, popoverEnterAnimation, popoverLeaveAnimation } from '@rdlabo/ionic-theme-ios27';
|
|
82
|
-
|
|
83
|
-
function loadIOSAnimations() {
|
|
84
|
-
if (typeof CSS === 'undefined') return {};
|
|
85
|
-
if (!CSS.supports('overflow-anchor: auto') && !CSS.supports('text-wrap: pretty')) return {};
|
|
86
|
-
|
|
87
|
-
return {
|
|
88
|
-
navAnimation: iosTransitionAnimation,
|
|
89
|
-
popoverEnter: popoverEnterAnimation,
|
|
90
|
-
popoverLeave: popoverLeaveAnimation,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
provideIonicAngular(isPlatform('ios') ? loadIOSAnimations() : {});
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
For Ionic 9 Angular, import `isPlatform` and `provideIonicAngular` from `@ionic/angular`. React and Vue can pass the same options to `setupIonicReact` or `IonicVue` during initialization. In server-rendered apps, run the selection during browser initialization.
|
|
98
|
-
|
|
99
|
-
The page-transition radius defaults to `0`. Native apps can update it after measuring the WebView:
|
|
100
|
-
|
|
101
|
-
```ts
|
|
102
|
-
import { setConfig } from '@rdlabo/ionic-theme-ios27';
|
|
103
|
-
|
|
104
|
-
setConfig({ radius });
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### Check the theme
|
|
108
|
-
|
|
109
|
-
Test on iOS. When previewing on desktop, set Ionic mode to `ios` in your existing framework initialization config (for example `mode: 'ios'`).
|
|
110
|
-
|
|
111
|
-
Use this markup to preview the inset grouped list look. For the list structure the theme expects, see [Using ion-item-group](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/using-ion-item-group).
|
|
112
|
-
|
|
113
|
-
```html
|
|
114
|
-
<ion-list mode="ios" inset="true">
|
|
115
|
-
<ion-item-group>
|
|
116
|
-
<ion-item><ion-label>Notifications</ion-label></ion-item>
|
|
117
|
-
<ion-item><ion-label>Appearance</ion-label></ion-item>
|
|
118
|
-
</ion-item-group>
|
|
119
|
-
</ion-list>
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
## Optional setups
|
|
123
|
-
|
|
124
|
-
### Support iPhone Duo without the iOS 27 theme (preview)
|
|
125
|
-
|
|
126
|
-
Keep your existing Ionic theme and move tabs and supported toolbar actions into a vertical side area. **Start in Chrome** with one stylesheet, an app class, and `enableVerticalControlArea()`; then connect the layout to iPhone Duo device events for the system rail and hinge posture.
|
|
127
|
-
|
|
128
|
-
Device state is supplied by [`@erkamyaman/capacitor-foldable`](https://github.com/erkamyaman/capacitor-foldable), installed in your app:
|
|
129
|
-
|
|
130
|
-
```bash
|
|
131
|
-
npm install @erkamyaman/capacitor-foldable
|
|
132
|
-
npx cap sync
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
Apply its fold state with `applyFoldStateClasses(root, fold)` and its bar placement with `setVerticalControlAreaPlacement({ edge: verticalBarEdge, nativeEdge: verticalBarEdge, inset })`. Device monitoring is not bundled with the theme.
|
|
136
|
-
|
|
137
|
-
Follow [iPhone Duo with your existing theme](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/iphone-duo-with-original-theme) for the browser preview and iOS setup. For control projection and the runtime API, see [Vertical Bars](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/vertical-bars). For device events and split panes, see [iPhone Duo support](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/iphone-duo). Available in `1.2.0` as a preview feature; APIs and supported behavior may change.
|
|
138
|
-
|
|
139
|
-
### Use only the iOS 27 theme
|
|
140
|
-
|
|
141
|
-
Install only `@rdlabo/ionic-theme-ios27` and import its styles unconditionally in your global stylesheet:
|
|
142
|
-
|
|
143
|
-
```css
|
|
144
|
-
@import '@rdlabo/ionic-theme-ios27/dist/css/default-variables.css';
|
|
145
|
-
@import '@rdlabo/ionic-theme-ios27/dist/css/ionic-theme-ios27.css';
|
|
146
|
-
@import '@rdlabo/ionic-theme-ios27/dist/css/md-remove-ios-class-effect.css';
|
|
147
|
-
@import '@rdlabo/ionic-theme-ios27/dist/css/ionic-theme-ios27-dark-class.css';
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
The last import uses class-based dark mode; choose the `-dark-system` or `-dark-always` variant and matching Ionic palette for another mode. Configure the iOS 27 animations with `isPlatform('ios')` as above, without the browser feature checks.
|
|
151
|
-
|
|
152
|
-
### Other options
|
|
153
|
-
|
|
154
|
-
- **Native controls:** Follow the [Native UI Shell setup guide](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/native-ui-shell). Stylesheet imports alone do not enable it.
|
|
155
|
-
- **Inset lists on Android:** Load the matching package's `md-ion-list-inset` stylesheet inside each `@supports` branch if needed. It is already included in `@rdlabo/ionic-theme-md3`.
|
|
156
|
-
|
|
157
|
-
### Use with the MD3 theme
|
|
158
|
-
|
|
159
|
-
Install all three themes to use iOS 27 on supported Safari versions, fall back to iOS 26 on the preceding Safari generation, and use MD3 whenever Ionic runs in Material Design mode. All three themes require `@ionic/core` 8.8.1 or later:
|
|
160
|
-
|
|
161
|
-
```bash
|
|
162
|
-
npm install @rdlabo/ionic-theme-ios26 @rdlabo/ionic-theme-ios27 @rdlabo/ionic-theme-md3
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
Keep the two iOS themes behind the same browser feature checks used by the default setup, then load MD3 unconditionally. Using `meta.load-css()` throughout also keeps the MD3 styles after the conditional iOS styles in the generated CSS:
|
|
166
|
-
|
|
167
|
-
```scss
|
|
168
|
-
@use 'sass:meta';
|
|
169
|
-
|
|
170
|
-
@supports (overflow-anchor: auto) {
|
|
171
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios27/src/styles/default-variables');
|
|
172
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios27/src/styles/ionic-theme-ios27');
|
|
173
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios27/src/styles/ionic-theme-ios27-dark-class');
|
|
174
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios27/src/styles/md-remove-ios-class-effect');
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
@supports (text-wrap: pretty) and (not (overflow-anchor: auto)) {
|
|
178
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios26/src/styles/default-variables');
|
|
179
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios26/src/styles/ionic-theme-ios26');
|
|
180
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios26/src/styles/ionic-theme-ios26-dark-class');
|
|
181
|
-
@include meta.load-css('@rdlabo/ionic-theme-ios26/src/styles/md-remove-ios-class-effect');
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
@include meta.load-css('@rdlabo/ionic-theme-md3/dist/css/default-variables.css');
|
|
185
|
-
@include meta.load-css('@rdlabo/ionic-theme-md3/dist/css/ionic-theme-md3.css');
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
The iOS styles apply only to Ionic's `ios` mode, while MD3 applies to `md` mode. The `md-remove-ios-class-effect` stylesheet in each iOS branch prevents iOS-only utility classes from leaking into MD mode. MD3 already includes its inset-list styles, so do not load either iOS package's optional `md-ion-list-inset` stylesheet in this configuration.
|
|
189
|
-
|
|
190
|
-
Load Ionic's matching dark palette too. The example uses class-based dark mode; for system or always-dark mode, select the matching variant for Ionic and both iOS themes.
|
|
191
|
-
|
|
192
|
-
Keep the iOS 27 transition for both iOS theme generations and select the MD3 transition in Material Design mode. Extend the animation setup above as follows:
|
|
193
|
-
|
|
194
|
-
```ts
|
|
195
|
-
import { isPlatform, provideIonicAngular } from '@ionic/angular/standalone'; // Ionic 8
|
|
196
|
-
import { iosTransitionAnimation, popoverEnterAnimation, popoverLeaveAnimation } from '@rdlabo/ionic-theme-ios27';
|
|
197
|
-
import { mdTransitionAnimation } from '@rdlabo/ionic-theme-md3';
|
|
198
|
-
|
|
199
|
-
function loadAnimations() {
|
|
200
|
-
if (!isPlatform('ios')) return { navAnimation: mdTransitionAnimation };
|
|
201
|
-
if (typeof CSS === 'undefined') return {};
|
|
202
|
-
if (!CSS.supports('overflow-anchor: auto') && !CSS.supports('text-wrap: pretty')) return {};
|
|
203
|
-
|
|
204
|
-
return {
|
|
205
|
-
navAnimation: iosTransitionAnimation,
|
|
206
|
-
popoverEnter: popoverEnterAnimation,
|
|
207
|
-
popoverLeave: popoverLeaveAnimation,
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
provideIonicAngular(loadAnimations());
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
For Ionic 9 Angular, import `isPlatform` and `provideIonicAngular` from `@ionic/angular`. React and Vue can pass the same returned options to `setupIonicReact` or `IonicVue`. If Sass cannot resolve a package in `meta.load-css()`, use the `stylePreprocessorOptions.includePaths` or relative-path setup described in Get started.
|
|
215
|
-
|
|
216
|
-
## Documentation
|
|
217
|
-
|
|
218
|
-
**Full documentation:** [Ionic Theme iOS27](https://docs.rdlabo.dev/projects/ionic-theme-ios27)
|
|
219
|
-
|
|
220
|
-
- [Using ion-item-group](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/using-ion-item-group) — required markup for inset lists.
|
|
221
|
-
- [Special markup and classes](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/special-markup) — opt-in markup and utility classes used by the theme.
|
|
222
|
-
- [ESLint](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/eslint) — check list structure with ESLint rules.
|
|
223
|
-
- [Features](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/features) — CSS variables, Liquid Glass, selective imports, and dark mode.
|
|
224
|
-
- [Native UI Shell (Preview)](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/native-ui-shell) — project supported Ionic controls, text, and icons into UIKit.
|
|
225
|
-
- [Vertical Bars (preview)](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/vertical-bars) — side-rail layout, control eligibility, native button appearance and runtime API.
|
|
226
|
-
- [iPhone Duo support (preview)](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/iphone-duo) — vertical system rail, hinge posture, and split-pane layout; usable without the theme or the shell.
|
|
227
|
-
- [iPhone Duo with your existing theme (preview)](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/iphone-duo-with-original-theme) — standalone setup that keeps your existing Web theme.
|
|
228
|
-
- [Animation](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/animation) — tab, segment, and searchable effects.
|
|
229
|
-
- [Migration from iOS 26](https://docs.rdlabo.dev/projects/ionic-theme-ios27/docs/migration) — upgrade an existing app, including stylesheet, class, and CSS variable changes.
|
|
230
|
-
- [iOS 26 migration history](https://docs.rdlabo.dev/projects/ionic-theme-ios26/docs/migration) — earlier major-version changes for the previous package.
|
|
231
|
-
|
|
232
|
-
<!-- rdlabo-docs-omit -->
|
|
233
|
-
|
|
234
|
-
**iOS 26 theme:** See the [iOS 26 documentation](https://docs.rdlabo.dev/projects/ionic-theme-ios26).
|
|
235
|
-
|
|
236
|
-
## Development & Testing
|
|
237
|
-
|
|
238
|
-
### JavaScript module builds
|
|
239
|
-
|
|
240
|
-
Keep relative imports in TypeScript source extensionless, matching Ionic's source
|
|
241
|
-
style. The shared `rdlabo-build-theme` CLI from `@rdlabo/ionic-theme-utils` uses
|
|
242
|
-
tsdown to resolve imports when generating ESM JavaScript and type declarations.
|
|
243
|
-
Dependencies remain external, and source files are not rewritten.
|
|
244
|
-
|
|
245
|
-
Run `npm run build && npm run test:esm` to build and verify the npm tarball with
|
|
246
|
-
the shared `rdlabo-check-esm` CLI. Public JavaScript entry points can be imported
|
|
247
|
-
in Node.js without a DOM; UI operations still require a browser or a supported
|
|
248
|
-
native environment. The package ships ESM only.
|
|
249
|
-
|
|
250
|
-
### Demo Application
|
|
251
|
-
|
|
252
|
-
The same demo is deployed against both supported Ionic versions:
|
|
253
|
-
|
|
254
|
-
- [Ionic 9 demo](https://ionic-theme-ios27.rdlabo.dev) — canonical
|
|
255
|
-
- [Ionic 8 demo](https://ionic8-theme-ios27.rdlabo.dev) — compatibility
|
|
256
|
-
|
|
257
|
-
The `demo/` directory contains the Angular application used by both deployments. To run it locally:
|
|
258
|
-
|
|
259
|
-
```bash
|
|
260
|
-
cd demo
|
|
261
|
-
npm install
|
|
262
|
-
npm start
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
### Visual Regression Testing
|
|
266
|
-
|
|
267
|
-
Playwright compares screenshots of demo routes in light and dark modes against stored baselines to catch unintended visual changes. These regression tests do not measure similarity to iOS 27 reference screens.
|
|
268
|
-
|
|
269
|
-
#### Running Tests
|
|
270
|
-
|
|
271
|
-
```bash
|
|
272
|
-
cd demo
|
|
273
|
-
|
|
274
|
-
# Run all E2E tests
|
|
275
|
-
npm run test:e2e
|
|
276
|
-
|
|
277
|
-
# Run tests in UI mode (interactive)
|
|
278
|
-
npm run test:e2e:ui
|
|
279
|
-
|
|
280
|
-
# Debug tests
|
|
281
|
-
npm run test:e2e:debug
|
|
282
|
-
|
|
283
|
-
# Update baseline screenshots (when intentionally changing UI)
|
|
284
|
-
npm run test:e2e:update
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
### Releases
|
|
288
|
-
|
|
289
|
-
Stable `ios27-vX.Y.Z` tags publish to npm `latest` through the [release workflow](./.github/workflows/release.yml). Maintainers create release tags with `npm run release`. Pull request and merge candidates use the npm `beta` tag; prerelease tags use `next`.
|
|
290
|
-
|
|
291
|
-
<!-- /rdlabo-docs-omit -->
|
|
30
|
+
Use the [four-step setup guide](docs/setup.md) to install the theme, load styles, configure animations, and preview your first screen. It supports Ionic 8.8.1 or later within Ionic 8 or 9, including Angular, React, and Vue. Capacitor is not required.
|
|
292
31
|
|
|
293
|
-
|
|
32
|
+
The theme styles toolbars, tabs, lists, buttons, search, and overlays, with light and dark appearances. It does not activate native controls. Once the Web theme is working, you can optionally [add Native UI](docs/add-native-ui.md).
|
|
294
33
|
|
|
295
|
-
##
|
|
34
|
+
## Customize your app
|
|
296
35
|
|
|
297
|
-
- [
|
|
298
|
-
|
|
36
|
+
- [Features](docs/features.md): CSS variables, Liquid Glass, and selective component imports.
|
|
37
|
+
- [Special markup and classes](docs/special-markup.md): opt-in component behavior.
|
|
38
|
+
- [Using ion-item-group](docs/using-ion-item-group.md): inset list markup.
|
|
39
|
+
- [Animation](docs/animation.md): tab, segment, and search effects.
|
|
40
|
+
- [ESLint](docs/eslint.md): catch unsupported list structure.
|
|
41
|
+
- [Vertical Bars layout](docs/vertical-bars-layout.md): spacing, RTL, and layout helpers.
|
|
42
|
+
- [iPhone Duo device layout](docs/iphone-duo.md): connect device placement and hinge posture.
|