From 0e8ab49d7f4c44659e005cd84c403f64d26c6807 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Thu, 22 Aug 2019 16:11:50 -0400 Subject: [PATCH 1/7] fix(animation): set fill mode to MD transition to `both` (#19161) --- core/src/utils/transition/md.transition.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/utils/transition/md.transition.ts b/core/src/utils/transition/md.transition.ts index 17d9d937cb..86548ae344 100644 --- a/core/src/utils/transition/md.transition.ts +++ b/core/src/utils/transition/md.transition.ts @@ -16,6 +16,7 @@ export const mdTransitionAnimation = (_: HTMLElement, opts: TransitionOptions): rootTransition .addElement(ionPageElement) + .fill('both') .beforeRemoveClass('ion-page-invisible'); // animate the component itself From 547f6484334500ea6d1f904961cd83e02dd24482 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Thu, 22 Aug 2019 16:12:17 -0400 Subject: [PATCH 2/7] fix(animation): properties can be cleared after animation finishes (#19155) * remove certain properties when done animating * fix bug, add more tests * clean up * bug fix --- .../utils/animation/animation-interface.ts | 4 +- core/src/utils/animation/animation-utils.ts | 2 +- core/src/utils/animation/animation.ts | 75 +++++++++++++-- .../utils/animation/test/animation.spec.ts | 95 +++++++++++++++++++ core/src/utils/transition/ios.transition.ts | 2 +- 5 files changed, 164 insertions(+), 14 deletions(-) diff --git a/core/src/utils/animation/animation-interface.ts b/core/src/utils/animation/animation-interface.ts index 6407c263b3..c1a578207b 100644 --- a/core/src/utils/animation/animation-interface.ts +++ b/core/src/utils/animation/animation-interface.ts @@ -16,8 +16,8 @@ export interface Animation { progressEnd(shouldComplete: boolean, step: number, dur: number | undefined): Animation; from(property: string, value: any): Animation; - to(property: string, value: any): Animation; - fromTo(property: string, fromValue: any, toValue: any): Animation; + to(property: string, value: any, clearAfterAnimation?: boolean): Animation; + fromTo(property: string, fromValue: any, toValue: any, clearAfterAnimation?: boolean): Animation; keyframes(keyframes: any[]): Animation; addAnimation(animationToADd: Animation | Animation[] | undefined | null): Animation; diff --git a/core/src/utils/animation/animation-utils.ts b/core/src/utils/animation/animation-utils.ts index 6cf773076a..98ddcea951 100644 --- a/core/src/utils/animation/animation-utils.ts +++ b/core/src/utils/animation/animation-utils.ts @@ -43,7 +43,7 @@ export const generateKeyframeRules = (keyframes: any[] = []) => { const frameString = []; for (const property in keyframe) { - if (keyframe.hasOwnProperty(property) && property !== 'offset') { + if (keyframe.hasOwnProperty(property) && property !== 'offset' && property !== 'clear') { frameString.push(`${property}: ${keyframe[property]};`); } } diff --git a/core/src/utils/animation/animation.ts b/core/src/utils/animation/animation.ts index dd1d8337f5..ef08824f1d 100644 --- a/core/src/utils/animation/animation.ts +++ b/core/src/utils/animation/animation.ts @@ -1047,29 +1047,84 @@ export const createAnimation = () => { return ani; }; - const to = (property: string, value: any) => { + const to = (property: string, value: any, clearAfterAnimation?: boolean) => { const lastFrame = _keyframes[_keyframes.length - 1]; if (lastFrame != null && (lastFrame.offset === undefined || lastFrame.offset === 1)) { + + /** + * If last frame is not the clear frame + * set the value as usual + */ + if (!lastFrame.clear) { lastFrame[property] = value; + } else { + /** + * If last frame is the keyframe then we need to + * set the value on the previous frame + */ + const secondToLastFrame = _keyframes[_keyframes.length - 2]; + secondToLastFrame[property] = value; + } + + /** + * If not on the last possible keyframe, add + * the last keyframe + */ } else { - - const object: any = { - offset: 1 - }; - object[property] = value; - _keyframes = [ ..._keyframes, - object + { offset: 1, [property]: value } ]; } + if (clearAfterAnimation) { + const lastFrame = _keyframes[_keyframes.length - 1]; + if (lastFrame != null) { + + /** + * If we are on the clear frame, just set the property + */ + if (lastFrame.clear) { + lastFrame[property] = ''; + return ani; + } + + /** + * If we are already setup for a clear frame, just mark it + * as such and set the property + */ + const secondToLastFrame = _keyframes[_keyframes.length - 2]; + if (lastFrame.offset === 1 && secondToLastFrame.offset === 0.99) { + lastFrame.clear = true; + lastFrame[property] = ''; + secondToLastFrame[property] = value; + return ani; + } + + /** + * If the last frame is not the clear frame + * and has an offset of 1, we need to move it + * back by a frame to account for the clear frame + */ + if (lastFrame.offset === 1 && secondToLastFrame.offset !== 0.99) { + lastFrame.offset = 0.99; + } + + /** + * Add a clear frame that runs immediately after + * the last frame that the user has set. This will + * allow users to clear certain properties from elements + */ + _keyframes.push({ offset: lastFrame.offset + 0.01, [property]: '', clear: true }); + } + } + return ani; }; - const fromTo = (property: string, fromValue: any, toValue: any) => { - return from(property, fromValue).to(property, toValue); + const fromTo = (property: string, fromValue: any, toValue: any, clearAfterAnimation?: boolean) => { + return from(property, fromValue).to(property, toValue, clearAfterAnimation); }; return ani = { diff --git a/core/src/utils/animation/test/animation.spec.ts b/core/src/utils/animation/test/animation.spec.ts index b10d432252..6beab72835 100644 --- a/core/src/utils/animation/test/animation.spec.ts +++ b/core/src/utils/animation/test/animation.spec.ts @@ -81,6 +81,101 @@ describe('Animation Class', () => { expect(animation.getKeyframes().length).toEqual(3); }); + + it('should set the from keyframe properly', () => { + animation + .from('opacity', 0) + .from('background', 'red') + .from('color', 'purple'); + + const keyframes = animation.getKeyframes(); + + expect(keyframes.length).toEqual(1); + expect(keyframes[0]).toEqual({ + opacity: 0, + color: 'purple', + background: 'red', + offset: 0 + }); + }); + + it('should set the to keyframe properly', () => { + animation + .to('opacity', 0) + .to('background', 'red') + .to('color', 'purple'); + + const keyframes = animation.getKeyframes(); + expect(keyframes.length).toEqual(1); + expect(keyframes[0]).toEqual({ + opacity: 0, + color: 'purple', + background: 'red', + offset: 1 + }); + }); + + it('should clear properties at the end of an animation', () => { + animation + .fromTo('opacity', 0, 1, true) + .fromTo('background', 'red', 'blue') + .fromTo('color', 'purple', 'green', true); + + const keyframes = animation.getKeyframes(); + + expect(keyframes.length).toEqual(3); + expect(keyframes[0]).toEqual({ + opacity: 0, + color: 'purple', + background: 'red', + offset: 0 + }); + + expect(keyframes[1]).toEqual({ + opacity: 1, + color: 'green', + offset: 0.99, + background: 'blue' + }); + + expect(keyframes[2]).toEqual({ + clear: true, + opacity: '', + color: '', + offset: 1 + }) + }); + + it('should mix keyframes and fromTo properly', () => { + animation + .keyframes([ + { offset: 0, background: 'red' }, + { offset: 0.99, background: 'blue' }, + { offset: 1, background: 'green' } + ]) + .fromTo('opacity', 0, 1, true) + + const keyframes = animation.getKeyframes(); + expect(keyframes.length).toEqual(3); + expect(keyframes[0]).toEqual({ + opacity: 0, + background: 'red', + offset: 0 + }); + + expect(keyframes[1]).toEqual({ + opacity: 1, + background: 'blue', + offset: 0.99 + }); + + expect(keyframes[2]).toEqual({ + opacity: '', + background: 'green', + offset: 1, + clear: true + }); + }); }); describe('Animation Config Methods', () => { diff --git a/core/src/utils/transition/ios.transition.ts b/core/src/utils/transition/ios.transition.ts index a934967ce6..d987fa0350 100644 --- a/core/src/utils/transition/ios.transition.ts +++ b/core/src/utils/transition/ios.transition.ts @@ -138,7 +138,7 @@ export const iosTransitionAnimation = (navEl: HTMLElement, opts: TransitionOptio enteringToolBarBg .beforeClearStyles([OPACITY]) - .fromTo(OPACITY, 0.01, 1); + .fromTo(OPACITY, 0.01, 1, true); // forward direction, entering page has a back button enteringBackButton.fromTo(OPACITY, 0.01, 1); From fb7098080a47a40694ec807b5faa4c6710d93240 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Fri, 23 Aug 2019 10:56:05 -0400 Subject: [PATCH 3/7] fix(animation): enable backwards compatibility for overlay animations (#19160) * fix backwards compat for overlays * fix overlay * Address navigation edge case --- core/src/utils/animation/old-animation/index.ts | 2 +- core/src/utils/overlays.ts | 14 +++++++++----- core/src/utils/transition/index.ts | 3 ++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/core/src/utils/animation/old-animation/index.ts b/core/src/utils/animation/old-animation/index.ts index afecd60466..19fd3d5312 100644 --- a/core/src/utils/animation/old-animation/index.ts +++ b/core/src/utils/animation/old-animation/index.ts @@ -4,7 +4,7 @@ import { Animator } from './animator'; export const create = (animationBuilder?: AnimationBuilder, baseEl?: any, opts?: any): Promise => { if (animationBuilder) { - return animationBuilder(baseEl, opts); + return animationBuilder(Animator as any, baseEl, opts); } return Promise.resolve(new Animator() as any); }; diff --git a/core/src/utils/overlays.ts b/core/src/utils/overlays.ts index 1b0a732726..9477528bae 100644 --- a/core/src/utils/overlays.ts +++ b/core/src/utils/overlays.ts @@ -190,11 +190,15 @@ const overlayAnimation = async ( /** * TODO: Remove AnimationBuilder */ - const animation = await import('./animation/old-animation').then(mod => mod.create(animationBuilder as AnimationBuilder, aniRoot, opts)); - const isAnimationBuilder = (animation as any).fill === undefined; - - if (!isAnimationBuilder) { - (animation as any).fill('both'); + let animation; + let isAnimationBuilder = true; + try { + const mod = await import('./animation/old-animation'); + animation = await mod.create(animationBuilder as AnimationBuilder, aniRoot, opts); + } catch (err) { + animation = (animationBuilder as IonicAnimationInterface)(aniRoot, opts); + animation.fill('both'); + isAnimationBuilder = false; } overlay.animation = animation; diff --git a/core/src/utils/transition/index.ts b/core/src/utils/transition/index.ts index 2f8f940359..da153894be 100644 --- a/core/src/utils/transition/index.ts +++ b/core/src/utils/transition/index.ts @@ -85,7 +85,8 @@ const animation = async (animationBuilder: IonicAnimationInterface | AnimationBu let trans: Animation | IonicAnimation; try { - trans = await import('../animation/old-animation').then(mod => mod.create(animationBuilder as AnimationBuilder, opts.baseEl, opts)); + const mod = await import('../animation/old-animation'); + trans = await mod.create(animationBuilder as AnimationBuilder, opts.baseEl, opts); } catch (err) { trans = (animationBuilder as IonicAnimationInterface)(opts.baseEl, opts); } From fa958a576455e2e38266c24de9766f5e03daf0cc Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Fri, 23 Aug 2019 12:48:20 -0400 Subject: [PATCH 4/7] fix(animation): avoid partial keyframes (#19169) * ensure custom props not part of final keyframes * fix clear * clean up --- .../utils/animation/animation-interface.ts | 4 +- core/src/utils/animation/animation-utils.ts | 2 +- core/src/utils/animation/animation.ts | 79 ++----------------- .../utils/animation/test/animation.spec.ts | 39 +-------- core/src/utils/transition/ios.transition.ts | 7 +- 5 files changed, 19 insertions(+), 112 deletions(-) diff --git a/core/src/utils/animation/animation-interface.ts b/core/src/utils/animation/animation-interface.ts index c1a578207b..6407c263b3 100644 --- a/core/src/utils/animation/animation-interface.ts +++ b/core/src/utils/animation/animation-interface.ts @@ -16,8 +16,8 @@ export interface Animation { progressEnd(shouldComplete: boolean, step: number, dur: number | undefined): Animation; from(property: string, value: any): Animation; - to(property: string, value: any, clearAfterAnimation?: boolean): Animation; - fromTo(property: string, fromValue: any, toValue: any, clearAfterAnimation?: boolean): Animation; + to(property: string, value: any): Animation; + fromTo(property: string, fromValue: any, toValue: any): Animation; keyframes(keyframes: any[]): Animation; addAnimation(animationToADd: Animation | Animation[] | undefined | null): Animation; diff --git a/core/src/utils/animation/animation-utils.ts b/core/src/utils/animation/animation-utils.ts index 98ddcea951..6cf773076a 100644 --- a/core/src/utils/animation/animation-utils.ts +++ b/core/src/utils/animation/animation-utils.ts @@ -43,7 +43,7 @@ export const generateKeyframeRules = (keyframes: any[] = []) => { const frameString = []; for (const property in keyframe) { - if (keyframe.hasOwnProperty(property) && property !== 'offset' && property !== 'clear') { + if (keyframe.hasOwnProperty(property) && property !== 'offset') { frameString.push(`${property}: ${keyframe[property]};`); } } diff --git a/core/src/utils/animation/animation.ts b/core/src/utils/animation/animation.ts index ef08824f1d..0f6b016059 100644 --- a/core/src/utils/animation/animation.ts +++ b/core/src/utils/animation/animation.ts @@ -64,6 +64,8 @@ export const createAnimation = () => { elements.length = 0; childAnimations.length = 0; + _keyframes.length = 0; + clearOnFinish(); initialized = false; @@ -1033,13 +1035,8 @@ export const createAnimation = () => { if (firstFrame != null && (firstFrame.offset === undefined || firstFrame.offset === 0)) { firstFrame[property] = value; } else { - const object: any = { - offset: 0 - }; - object[property] = value; - _keyframes = [ - object, + { offset: 0, [property]: value }, ..._keyframes ]; } @@ -1047,84 +1044,22 @@ export const createAnimation = () => { return ani; }; - const to = (property: string, value: any, clearAfterAnimation?: boolean) => { + const to = (property: string, value: any) => { const lastFrame = _keyframes[_keyframes.length - 1]; if (lastFrame != null && (lastFrame.offset === undefined || lastFrame.offset === 1)) { - - /** - * If last frame is not the clear frame - * set the value as usual - */ - if (!lastFrame.clear) { - lastFrame[property] = value; - } else { - /** - * If last frame is the keyframe then we need to - * set the value on the previous frame - */ - const secondToLastFrame = _keyframes[_keyframes.length - 2]; - secondToLastFrame[property] = value; - } - - /** - * If not on the last possible keyframe, add - * the last keyframe - */ + lastFrame[property] = value; } else { _keyframes = [ ..._keyframes, { offset: 1, [property]: value } ]; } - - if (clearAfterAnimation) { - const lastFrame = _keyframes[_keyframes.length - 1]; - if (lastFrame != null) { - - /** - * If we are on the clear frame, just set the property - */ - if (lastFrame.clear) { - lastFrame[property] = ''; - return ani; - } - - /** - * If we are already setup for a clear frame, just mark it - * as such and set the property - */ - const secondToLastFrame = _keyframes[_keyframes.length - 2]; - if (lastFrame.offset === 1 && secondToLastFrame.offset === 0.99) { - lastFrame.clear = true; - lastFrame[property] = ''; - secondToLastFrame[property] = value; - return ani; - } - - /** - * If the last frame is not the clear frame - * and has an offset of 1, we need to move it - * back by a frame to account for the clear frame - */ - if (lastFrame.offset === 1 && secondToLastFrame.offset !== 0.99) { - lastFrame.offset = 0.99; - } - - /** - * Add a clear frame that runs immediately after - * the last frame that the user has set. This will - * allow users to clear certain properties from elements - */ - _keyframes.push({ offset: lastFrame.offset + 0.01, [property]: '', clear: true }); - } - } - return ani; }; - const fromTo = (property: string, fromValue: any, toValue: any, clearAfterAnimation?: boolean) => { - return from(property, fromValue).to(property, toValue, clearAfterAnimation); + const fromTo = (property: string, fromValue: any, toValue: any) => { + return from(property, fromValue).to(property, toValue); }; return ani = { diff --git a/core/src/utils/animation/test/animation.spec.ts b/core/src/utils/animation/test/animation.spec.ts index 6beab72835..a6f3fcf79a 100644 --- a/core/src/utils/animation/test/animation.spec.ts +++ b/core/src/utils/animation/test/animation.spec.ts @@ -114,37 +114,6 @@ describe('Animation Class', () => { offset: 1 }); }); - - it('should clear properties at the end of an animation', () => { - animation - .fromTo('opacity', 0, 1, true) - .fromTo('background', 'red', 'blue') - .fromTo('color', 'purple', 'green', true); - - const keyframes = animation.getKeyframes(); - - expect(keyframes.length).toEqual(3); - expect(keyframes[0]).toEqual({ - opacity: 0, - color: 'purple', - background: 'red', - offset: 0 - }); - - expect(keyframes[1]).toEqual({ - opacity: 1, - color: 'green', - offset: 0.99, - background: 'blue' - }); - - expect(keyframes[2]).toEqual({ - clear: true, - opacity: '', - color: '', - offset: 1 - }) - }); it('should mix keyframes and fromTo properly', () => { animation @@ -153,7 +122,7 @@ describe('Animation Class', () => { { offset: 0.99, background: 'blue' }, { offset: 1, background: 'green' } ]) - .fromTo('opacity', 0, 1, true) + .fromTo('opacity', 0, 1) const keyframes = animation.getKeyframes(); expect(keyframes.length).toEqual(3); @@ -164,16 +133,14 @@ describe('Animation Class', () => { }); expect(keyframes[1]).toEqual({ - opacity: 1, background: 'blue', offset: 0.99 }); expect(keyframes[2]).toEqual({ - opacity: '', + opacity: 1, background: 'green', - offset: 1, - clear: true + offset: 1 }); }); }); diff --git a/core/src/utils/transition/ios.transition.ts b/core/src/utils/transition/ios.transition.ts index d987fa0350..81d94a6237 100644 --- a/core/src/utils/transition/ios.transition.ts +++ b/core/src/utils/transition/ios.transition.ts @@ -138,7 +138,12 @@ export const iosTransitionAnimation = (navEl: HTMLElement, opts: TransitionOptio enteringToolBarBg .beforeClearStyles([OPACITY]) - .fromTo(OPACITY, 0.01, 1, true); + .keyframes([ + { offset: 0, opacity: 0.01 }, + { offset: 0.99, opacity: 1 }, + { offset: 1, opacity: 'var(--opacity)' } + // TODO: Find a way to support clearing properties from Web Animations + ]); // forward direction, entering page has a back button enteringBackButton.fromTo(OPACITY, 0.01, 1); From b1c8fa39d6703d42f234a0082a478e4b0925b81e Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Mon, 26 Aug 2019 11:33:11 -0400 Subject: [PATCH 5/7] fix(swipe-back): account for negative step values (#19188) fixes #19181 --- core/src/utils/gesture/swipe-back.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/utils/gesture/swipe-back.ts b/core/src/utils/gesture/swipe-back.ts index 5c7a96afd6..3ac10df3a3 100644 --- a/core/src/utils/gesture/swipe-back.ts +++ b/core/src/utils/gesture/swipe-back.ts @@ -37,7 +37,13 @@ export const createSwipeBackGesture = ( realDur = Math.min(dur, 540); } - onEndHandler(shouldComplete, stepValue, realDur); + /** + * TODO: stepValue can sometimes return a negative + * value, but you can't have a negative time value + * for the cubic bezier curve (at least with web animations) + * Not sure if the negative step value is an error or not + */ + onEndHandler(shouldComplete, (stepValue <= 0) ? 0.01 : stepValue, realDur); }; return createGesture({ From b3c7436e01268d31e92c80f8e85a552523d642f6 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Tue, 27 Aug 2019 10:12:52 -0400 Subject: [PATCH 6/7] fix(animation): account for negative values on menu gesture (#19196) --- core/src/components/menu/menu.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/src/components/menu/menu.tsx b/core/src/components/menu/menu.tsx index 68aa6ceee4..8d4eeeb09f 100644 --- a/core/src/components/menu/menu.tsx +++ b/core/src/components/menu/menu.tsx @@ -415,6 +415,14 @@ export class Menu implements ComponentInterface, MenuI { // Account for rounding errors in JS let newStepValue = (shouldComplete) ? 0.001 : -0.001; + /** + * TODO: stepValue can sometimes return a negative + * value, but you can't have a negative time value + * for the cubic bezier curve (at least with web animations) + * Not sure if the negative step value is an error or not + */ + const adjustedStepValue = (stepValue <= 0) ? 0.01 : stepValue; + /** * Animation will be reversed here, so need to * reverse the easing curve as well @@ -423,7 +431,7 @@ export class Menu implements ComponentInterface, MenuI { * to the new easing curve, as `stepValue` is going to be given * in terms of a linear curve. */ - newStepValue += getTimeGivenProgression(new Point(0, 0), new Point(0.4, 0), new Point(0.6, 1), new Point(1, 1), stepValue); + newStepValue += getTimeGivenProgression(new Point(0, 0), new Point(0.4, 0), new Point(0.6, 1), new Point(1, 1), adjustedStepValue); this.animation .easing('cubic-bezier(0.4, 0.0, 0.6, 1)') From 4902de4631b69805ce46b8d72ea34cacf92e6d90 Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Tue, 27 Aug 2019 11:56:32 -0400 Subject: [PATCH 7/7] 4.8.1 --- CHANGELOG.md | 12 ++++++++++++ angular/package.json | 4 ++-- core/package.json | 2 +- docs/package.json | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0f68f2cfb..0d84562475 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## [4.8.1](https://github.com/ionic-team/ionic/compare/v4.8.0...v4.8.1) (2019-08-27) + + +### Bug Fixes + +* **animation:** enable backwards compatibility for overlay animations ([#19160](https://github.com/ionic-team/ionic/issues/19160)) ([fb70980](https://github.com/ionic-team/ionic/commit/fb70980)) +* **gesture:** account for negative step values with Web Animations ([#19196](https://github.com/ionic-team/ionic/issues/19196)) ([b3c7436](https://github.com/ionic-team/ionic/commit/b3c7436)) +* **ios:** clear opacity on toolbar background after iOS transition ([#19169](https://github.com/ionic-team/ionic/issues/19169)) ([fa958a5](https://github.com/ionic-team/ionic/commit/fa958a5)) +* **md:** set fill mode on MD transition to `both` ([#19161](https://github.com/ionic-team/ionic/issues/19161)) ([0e8ab49](https://github.com/ionic-team/ionic/commit/0e8ab49)) + + + # [4.8.0 Oxygen](https://github.com/ionic-team/ionic/compare/v4.7.4...v4.8.0) (2019-08-21) diff --git a/angular/package.json b/angular/package.json index 75e0fef7f2..2cc5e5c9a5 100644 --- a/angular/package.json +++ b/angular/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/angular", - "version": "4.8.0", + "version": "4.8.1", "description": "Angular specific wrappers for @ionic/core", "keywords": [ "ionic", @@ -49,7 +49,7 @@ "css/" ], "dependencies": { - "@ionic/core": "4.8.0", + "@ionic/core": "4.8.1", "tslib": "^1.9.3" }, "peerDependencies": { diff --git a/core/package.json b/core/package.json index 68bb49129e..1c47c847ee 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/core", - "version": "4.8.0", + "version": "4.8.1", "description": "Base components for Ionic", "keywords": [ "ionic", diff --git a/docs/package.json b/docs/package.json index 94257da652..e159b705b2 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/docs", - "version": "4.8.0", + "version": "4.8.1", "description": "Pre-packaged API documentation for the Ionic docs.", "main": "core.json", "files": [