feat(popover): change MD animation and use for WP also

references #5420
This commit is contained in:
Brandy Carney
2016-05-27 12:46:33 -04:00
parent c944ffd4d7
commit 44a7da8adc
5 changed files with 27 additions and 58 deletions

View File

@ -14,9 +14,6 @@ $popover-md-box-shadow: 0 3px 12px 2px $popover-md-box-shadow-col
$popover-md-item-background: $popover-md-background !default; $popover-md-item-background: $popover-md-background !default;
.popover-wrapper {
opacity: 1;
}
.popover-content { .popover-content {
width: $popover-md-width; width: $popover-md-width;
@ -38,4 +35,5 @@ $popover-md-item-background: $popover-md-background !default;
.popover-viewport { .popover-viewport {
opacity: 0; opacity: 0;
transition-delay: 100ms;
} }

View File

@ -7,7 +7,7 @@ import {Config} from '../../config/config';
import {NavParams} from '../nav/nav-params'; import {NavParams} from '../nav/nav-params';
import {Platform} from '../../platform/platform'; import {Platform} from '../../platform/platform';
import {isPresent, isUndefined, isDefined} from '../../util/util'; import {isPresent, isUndefined, isDefined} from '../../util/util';
import {nativeRaf} from '../../util/dom'; import {nativeRaf, CSS} from '../../util/dom';
import {ViewController} from '../nav/view-controller'; import {ViewController} from '../nav/view-controller';
const POPOVER_BODY_PADDING = 2; const POPOVER_BODY_PADDING = 2;
@ -245,6 +245,8 @@ class PopoverTransition extends Transition {
let originY = 'top'; let originY = 'top';
let originX = 'left'; let originX = 'left';
let popoverWrapperEle = <HTMLElement>nativeEle.querySelector('.popover-wrapper');
// Popover content width and height // Popover content width and height
let popoverEle = <HTMLElement>nativeEle.querySelector('.popover-content'); let popoverEle = <HTMLElement>nativeEle.querySelector('.popover-content');
let popoverDim = popoverEle.getBoundingClientRect(); let popoverDim = popoverEle.getBoundingClientRect();
@ -313,7 +315,11 @@ class PopoverTransition extends Transition {
popoverEle.style.top = popoverCSS.top + 'px'; popoverEle.style.top = popoverCSS.top + 'px';
popoverEle.style.left = popoverCSS.left + 'px'; popoverEle.style.left = popoverCSS.left + 'px';
popoverEle.style.transformOrigin = originY + " " + originX; popoverEle.style[CSS.transformOrigin] = originY + " " + originX;
// Since the transition starts before styling is done we
// want to wait for the styles to apply before showing the wrapper
popoverWrapperEle.style.opacity = '1';
} }
} }
@ -373,16 +379,15 @@ class PopoverMdPopIn extends PopoverTransition {
let ele = enteringView.pageRef().nativeElement; let ele = enteringView.pageRef().nativeElement;
let wrapper = new Animation(ele.querySelector('.popover-wrapper'));
let content = new Animation(ele.querySelector('.popover-content')); let content = new Animation(ele.querySelector('.popover-content'));
let viewport = new Animation(ele.querySelector('.popover-viewport')); let viewport = new Animation(ele.querySelector('.popover-viewport'));
content.fromTo('scale', '0', '1'); content.fromTo('scale', '0.001', '1');
viewport.fromTo('opacity', '0', '1'); viewport.fromTo('opacity', '0', '1');
this this
.easing('cubic-bezier(.55,0,.55,.2)') .easing('cubic-bezier(0.36,0.66,0.04,1)')
.duration(500) .duration(300)
.add(content) .add(content)
.add(viewport); .add(viewport);
} }
@ -416,50 +421,4 @@ class PopoverMdPopOut extends PopoverTransition {
Transition.register('popover-md-pop-out', PopoverMdPopOut); Transition.register('popover-md-pop-out', PopoverMdPopOut);
class PopoverWpPopIn extends PopoverTransition {
constructor(private enteringView: ViewController, private leavingView: ViewController, private opts: TransitionOptions) {
super(opts);
let ele = enteringView.pageRef().nativeElement;
let wrapper = new Animation(ele.querySelector('.popover-wrapper'));
wrapper.fromTo('opacity', '0.01', '1');
this
.easing('ease')
.duration(100)
.fadeIn()
.add(wrapper);
}
play() {
nativeRaf(() => {
this.positionView(this.enteringView.pageRef().nativeElement, this.opts.ev);
super.play();
});
}
}
Transition.register('popover-wp-pop-in', PopoverWpPopIn);
class PopoverWpPopOut extends PopoverTransition {
constructor(private enteringView: ViewController, private leavingView: ViewController, private opts: TransitionOptions) {
super(opts);
let ele = leavingView.pageRef().nativeElement;
let wrapper = new Animation(ele.querySelector('.popover-wrapper'));
wrapper.fromTo('opacity', '1', '0');
this
.easing('ease')
.duration(500)
.fadeIn()
.add(wrapper);
}
}
Transition.register('popover-wp-pop-out', PopoverWpPopOut);
let popoverIds = -1; let popoverIds = -1;

View File

@ -16,15 +16,23 @@ $popover-wp-item-background: $popover-wp-background !default;
.popover-content { .popover-content {
width: $popover-wp-width; width: $popover-wp-width;
min-width: 0;
min-height: 0;
max-height: $popover-wp-max-height; max-height: $popover-wp-max-height;
border: $popover-wp-border; border: $popover-wp-border;
border-radius: $popover-wp-border-radius; border-radius: $popover-wp-border-radius;
color: $popover-wp-text-color; color: $popover-wp-text-color;
background: $popover-wp-background; background: $popover-wp-background;
transform-origin: top left;
} }
.popover-content .item { .popover-content .item {
background-color: $popover-wp-item-background; background-color: $popover-wp-item-background;
} }
.popover-viewport {
opacity: 0;
transition-delay: 100ms;
}

View File

@ -117,8 +117,8 @@ Config.setModeConfig('wp', {
pickerEnter: 'picker-slide-in', pickerEnter: 'picker-slide-in',
pickerLeave: 'picker-slide-out', pickerLeave: 'picker-slide-out',
popoverEnter: 'popover-wp-pop-in', popoverEnter: 'popover-md-pop-in',
popoverLeave: 'popover-wp-pop-out', popoverLeave: 'popover-md-pop-out',
spinner: 'circles', spinner: 'circles',

View File

@ -57,6 +57,7 @@ export let CSS: {
transitionTimingFn?: string, transitionTimingFn?: string,
transitionStart?: string, transitionStart?: string,
transitionEnd?: string, transitionEnd?: string,
transformOrigin?: string
} = {}; } = {};
(function() { (function() {
@ -94,6 +95,9 @@ export let CSS: {
// To be sure transitionend works everywhere, include *both* the webkit and non-webkit events // To be sure transitionend works everywhere, include *both* the webkit and non-webkit events
CSS.transitionEnd = (isWebkit ? 'webkitTransitionEnd ' : '') + 'transitionend'; CSS.transitionEnd = (isWebkit ? 'webkitTransitionEnd ' : '') + 'transitionend';
// transform origin
CSS.transformOrigin = (isWebkit ? '-webkit-' : '') + 'transform-origin';
})(); })();