diff --git a/packages/vue/src/components/IonPage.ts b/packages/vue/src/components/IonPage.ts index 107fbafcd82..8b30719a969 100644 --- a/packages/vue/src/components/IonPage.ts +++ b/packages/vue/src/components/IonPage.ts @@ -11,12 +11,13 @@ export const IonPage = /*@__PURE__*/ defineComponent({ }, setup(props, { attrs, slots }) { const hidePageClass = (props.isInOutlet) ? 'ion-page-invisible' : ''; + const pageClass = attrs.class || ''; return () => { return h( 'div', { - ['class']: `ion-page ${hidePageClass}`, ...attrs, + ['class']: `ion-page ${hidePageClass} ${pageClass}`, ref: 'ionPage' }, slots.default && slots.default() diff --git a/packages/vue/test-app/src/router/index.ts b/packages/vue/test-app/src/router/index.ts index 6336e0deec9..acaa24da75a 100644 --- a/packages/vue/test-app/src/router/index.ts +++ b/packages/vue/test-app/src/router/index.ts @@ -13,6 +13,18 @@ const routes: Array = [ beforeEnter: DelayGuard, component: Home }, + { + path: '/ion-page-class-object', + component: () => import('@/views/IonPageClass/Object.vue') + }, + { + path: '/ion-page-class-string', + component: () => import('@/views/IonPageClass/String.vue') + }, + { + path: '/ion-page-class-undefined', + component: () => import('@/views/IonPageClass/Undefined.vue') + }, { path: '/lifecycle', component: () => import('@/views/Lifecycle.vue') diff --git a/packages/vue/test-app/src/views/IonPageClass/Object.vue b/packages/vue/test-app/src/views/IonPageClass/Object.vue new file mode 100644 index 00000000000..ee6ba0b4ecc --- /dev/null +++ b/packages/vue/test-app/src/views/IonPageClass/Object.vue @@ -0,0 +1,26 @@ + + + diff --git a/packages/vue/test-app/src/views/IonPageClass/String.vue b/packages/vue/test-app/src/views/IonPageClass/String.vue new file mode 100644 index 00000000000..a5d2213363d --- /dev/null +++ b/packages/vue/test-app/src/views/IonPageClass/String.vue @@ -0,0 +1,24 @@ + + + diff --git a/packages/vue/test-app/src/views/IonPageClass/Undefined.vue b/packages/vue/test-app/src/views/IonPageClass/Undefined.vue new file mode 100644 index 00000000000..a5be514e84d --- /dev/null +++ b/packages/vue/test-app/src/views/IonPageClass/Undefined.vue @@ -0,0 +1,24 @@ + + + diff --git a/packages/vue/test-app/tests/e2e/specs/page.js b/packages/vue/test-app/tests/e2e/specs/page.js new file mode 100644 index 00000000000..199a93ba87f --- /dev/null +++ b/packages/vue/test-app/tests/e2e/specs/page.js @@ -0,0 +1,27 @@ +describe('IonPage', () => { + it('Inherits object attribute while retaining ionic critical classes', () => { + cy.visit('http://localhost:8080/ion-page-class-object'); + + cy.get('.ion-page-additional-class').should('have.class', 'ion-page'); + + cy.get('#navigation').click(); + + cy.get('.ion-page-additional-class').should('have.class', 'ion-page-hidden'); + }); + + it('Inherits string class attribute while retaining ionic critical classes', () => { + cy.visit('http://localhost:8080/ion-page-class-string'); + + cy.get('.ion-page-additional-class').should('have.class', 'ion-page'); + + cy.get('#navigation').click(); + + cy.get('.ion-page-additional-class').should('have.class', 'ion-page-hidden'); + }); + + it('Correctly renders class attribute when no class attribute is set', () => { + cy.visit('http://localhost:8080/ion-page-class-undefined'); + + cy.get('.ion-page').should('not.have.class', 'undefined'); + }); +});