-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Description
Prerequisites
- I have read the Contributing Guidelines.
- I agree to follow the Code of Conduct.
- I have searched for existing issues that already report this problem, without success.
Ionic Framework Version
v8.x (8.8.1)
Current Behavior
After upgrading from @ionic/angular 8.7.17 to 8.8.1, fullscreen modals (presented via ModalController with cssClass: "fullscreen") that contain ion-content but no ion-footer display a white gap at the bottom on iOS devices with a home indicator (safe area).
This is caused by the new applyFullscreenSafeArea() method in modal.tsx (introduced in PR #30949, included in 8.8.1). The method contains this logic:
let hasContent = false;
let hasFooter = false;
for (const child of Array.from(el.children)) {
if (child.tagName === 'ION-CONTENT') hasContent = true;
if (child.tagName === 'ION-FOOTER') hasFooter = true;
for (const grandchild of Array.from(child.children)) {
if (grandchild.tagName === 'ION-CONTENT') hasContent = true;
if (grandchild.tagName === 'ION-FOOTER') hasFooter = true;
}
}
if (!hasContent || hasFooter) return;
wrapperEl.style.setProperty('height', 'calc(var(--height) - var(--ion-safe-area-bottom, 0px))');
wrapperEl.style.setProperty('padding-bottom', 'var(--ion-safe-area-bottom, 0px)');When ion-content is present without ion-footer, the wrapper height is reduced by --ion-safe-area-bottom and equivalent padding is added. This creates a visible white gap at the bottom of the modal because the flex content area shrinks but the modal's visual boundary doesn't move.
This is a regression — the same templates worked correctly on 8.7.17.
Expected Behavior
Fullscreen modals with ion-content and no ion-footer should render identically to how they did in 8.7.x — filling the entire screen without a gap at the bottom. The content inside ion-content already handles its own safe-area padding via --ion-safe-area-bottom on the scroll container. Applying it a second time at the wrapper level causes double safe-area compensation.
Steps to Reproduce
- Create an Ionic Angular app with
@ionic/angular8.8.1 - Create a modal component with this template:
<ion-header>
<ion-toolbar>
<ion-title>Modal Title</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<p>Some content here</p>
</ion-content>
<!-- No ion-footer -->- Present it as a fullscreen modal:
const modal = await this.modalCtrl.create({
component: MyModalComponent,
cssClass: 'fullscreen'
});
await modal.present();- Run on an iOS device/simulator with a home indicator (iPhone X or later)
- Observe a white gap at the bottom of the modal
Code Reproduction URL
Reproduction project can be provided upon request.
Ionic Info
Ionic:
Ionic CLI : 7.2.1
Ionic Framework : @ionic/angular 8.8.1
@angular/cli : 21.3.1
@ionic/angular-toolkit : 12.3.0
Capacitor:
Capacitor CLI : 8.1.0
@capacitor/android : 8.1.0
@capacitor/core : 8.1.0
@capacitor/ios : 8.1.0
System:
NodeJS : v22.17.0
npm : 10.9.2
OS : macOS
Additional Information
Root cause: PR #30949 (resolving #28411 and #30900) added applyFullscreenSafeArea() to handle safe-area insets dynamically for modals. The heuristic if (!hasContent || hasFooter) return; assumes that any modal with ion-content and no ion-footer needs wrapper-level safe-area compensation. However, ion-content already handles bottom safe-area internally via its scroll container, so this creates a double safe-area effect.
Affected templates: Any modal that uses ion-content without ion-footer — a very common pattern for settings modals, info modals, selection modals, etc.
Current workaround: Add an empty <ion-footer></ion-footer> after </ion-content> in the modal template. This triggers the hasFooter early-exit path, preventing the wrapper height reduction:
<ion-content>
<!-- modal content -->
</ion-content>
<!-- Workaround: empty ion-footer prevents applyFullscreenSafeArea() regression -->
<ion-footer></ion-footer>Suggested fix considerations:
ion-contentalready applies--ion-safe-area-bottomto its scroll padding. The wrapper-level adjustment creates double compensation.- Consider only applying the wrapper adjustment when the modal does NOT contain
ion-content(raw HTML modals), or whenion-contenthasfullscreen="false", rather than whenion-footeris absent. - Alternatively, check whether the modal's
--heightis100%(fullscreen) before reducing it.