Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions core/src/components/header/header.ios.scss
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,11 @@
* We use opacity: 0 to avoid a layout shift.
* We target both the attribute and the class in the event that the attribute
* is not reflected on the host in some frameworks.
*
* Both headers should be scoped to iOS mode otherwise an MD app that uses an
* iOS header may cause other MD headers to be unexpectedly hidden.
*/
ion-header:not(.header-collapse-main):has(~ ion-content ion-header[collapse="condense"],
~ ion-content ion-header.header-collapse-condense) {
ion-header.header-ios:not(.header-collapse-main):has(~ ion-content ion-header.header-ios[collapse="condense"],
~ ion-content ion-header.header-ios.header-collapse-condense) {
opacity: 0;
}
88 changes: 88 additions & 0 deletions core/src/components/header/test/basic/header.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,91 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, screenshot, c
});
});
});

/**
* This test only impacts MD applications
*/
configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
test.describe(title('header: translucent'), () => {
test('should not hide MD headers when using a descendant iOS header in an MD app', async ({ page }) => {
test.info().annotations.push({
type: 'issue',
description: 'https://github.com/ionic-team/ionic-framework/issues/28867',
});
await page.setContent(
`
<ion-header id="main-header">
<ion-toolbar>
<ion-title>Header</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-header collapse="condense">
<ion-toolbar>
<ion-title size="large">Header</ion-title>
</ion-toolbar>
</ion-header>

<ion-header mode="ios">
<ion-toolbar>
<ion-title>Welcome</ion-title>
</ion-toolbar>
</ion-header>
</ion-content>
`,
config
);

const header = page.locator('ion-header#main-header');

/**
* The existence of the iOS header in an MD app should not cause the main MD header
* to be hidden. We do not have toHaveVisible because the behavior that hides
* the header under correct circumstances does it using opacity: 0.
* Playwright considers an element with opacity: 0 to still be visible
* because it has a non-zero bounding box.
*/
await expect(header).toHaveScreenshot(screenshot('header-md-visibility-ios-descendant'));
});
test('should not hide MD headers when using a root iOS header in an MD app', async ({ page }) => {
test.info().annotations.push({
type: 'issue',
description: 'https://github.com/ionic-team/ionic-framework/issues/28867',
});
await page.setContent(
`
<ion-header id="main-header" mode="ios">
<ion-toolbar>
<ion-title>Header</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-header collapse="condense">
<ion-toolbar>
<ion-title size="large">Header</ion-title>
</ion-toolbar>
</ion-header>

<ion-header>
<ion-toolbar>
<ion-title>Welcome</ion-title>
</ion-toolbar>
</ion-header>
</ion-content>
`,
config
);

const header = page.locator('ion-header#main-header');

/**
* The existence of the iOS header in an MD app should not cause the main MD header
* to be hidden. We do not have toHaveVisible because the behavior that hides
* the header under correct circumstances does it using opacity: 0.
* Playwright considers an element with opacity: 0 to still be visible
* because it has a non-zero bounding box.
*/
await expect(header).toHaveScreenshot(screenshot('header-md-visibility-ios-main'));
});
});
});
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.