diff --git a/ionic/components/app/z-index.scss b/ionic/components/app/z-index.scss
index 3b22db0f74..85b464145f 100644
--- a/ionic/components/app/z-index.scss
+++ b/ionic/components/app/z-index.scss
@@ -5,6 +5,7 @@
$z-index-aside-overlay: 80 !default;
+$z-index-aside-backdrop: 79 !default;
$z-index-overlay: 1000 !default;
$z-index-click-block: 9999 !default;
diff --git a/ionic/components/aside/aside.scss b/ionic/components/aside/aside.scss
index 64b682c6ec..d04e173d0f 100644
--- a/ionic/components/aside/aside.scss
+++ b/ionic/components/aside/aside.scss
@@ -6,6 +6,7 @@ $aside-width: 304px !default;
$aside-small-width: $aside-width - 40px !default;
$aside-transition: 0.2s ease transform !default;
+$aside-backdrop-transition: 0.2s ease background-color !default;
$aside-background: $background-color !default;
$aside-shadow: -1px 0px 8px rgba(0, 0, 0, 0.2) !default;
@@ -26,6 +27,25 @@ $aside-shadow: -1px 0px 8px rgba(0, 0, 0, 0.2) !default;
transform: translate3d(0, 0, 0);
transition: $aside-transition;
+ &.no-transition {
+ ion-aside-backdrop {
+ transition: none;
+ }
+ }
+
+ ion-aside-backdrop {
+ z-index: $z-index-aside-backdrop;
+ transition: $aside-backdrop-transition;
+ transform: translateX($aside-width);
+ top: 0;
+ right: 0;
+ left: 0;
+ bottom: 0;
+ position: fixed;
+ background-color: rgba(0,0,0,0);;
+ }
+
+
&[type=overlay] {
z-index: $z-index-aside-overlay;
}
@@ -45,6 +65,10 @@ $aside-shadow: -1px 0px 8px rgba(0, 0, 0, 0.2) !default;
}
&[type=overlay] {
transform: translate3d($aside-width,0,0);
+
+ ion-aside-backdrop {
+ background-color: rgba(0,0,0,0.6);
+ }
}
}
diff --git a/ionic/components/aside/aside.ts b/ionic/components/aside/aside.ts
index 09d973a104..1bd660d289 100644
--- a/ionic/components/aside/aside.ts
+++ b/ionic/components/aside/aside.ts
@@ -1,4 +1,4 @@
-import {View, EventEmitter, ElementRef} from 'angular2/angular2';
+import {forwardRef, Component, Host, View, EventEmitter, ElementRef} from 'angular2/angular2';
import {Ion} from '../ion';
import {IonicConfig} from '../../config/config';
@@ -23,8 +23,8 @@ import {dom} from 'ionic/util'
},
delegates: {
gesture: [
- [instance => instance.side == 'top', gestures.TopAsideGesture],
- [instance => instance.side == 'bottom', gestures.BottomAsideGesture],
+ //[instance => instance.side == 'top', gestures.TopAsideGesture],
+ //[instance => instance.side == 'bottom', gestures.BottomAsideGesture],
[instance => instance.side == 'right', gestures.RightAsideGesture],
[instance => instance.side == 'left', gestures.LeftAsideGesture],
],
@@ -37,7 +37,8 @@ import {dom} from 'ionic/util'
events: ['opening']
})
@View({
- template: ''
+ template: '',
+ directives: [forwardRef(() => AsideBackdrop)]
})
export class Aside extends Ion {
@@ -68,6 +69,10 @@ export class Aside extends Ion {
this.opening.next(v);
}
+ setDoneTransforming(willOpen) {
+ this.typeDelegate.setDoneTransforming(willOpen);
+ }
+
setTransform(transform) {
this.typeDelegate.setTransform(transform)
}
@@ -86,8 +91,6 @@ export class Aside extends Ion {
}
setOpen(isOpen) {
- console.log('SET OPEN', isOpen);
- console.trace();
if (isOpen !== this.isOpen) {
this.isOpen = isOpen
this.setChanging(true)
@@ -114,3 +117,38 @@ export class Aside extends Ion {
}
}
+
+
+@Component({
+ selector: 'ion-aside-backdrop',
+ host: {
+ '[style.width]': 'width',
+ '[style.height]': 'height',
+ '[style.backgroundColor]': 'backgroundColor',
+ '(click)': 'clicked($event)'
+ }
+})
+
+@View({
+ template: ''
+})
+export class AsideBackdrop extends Ion {
+ constructor(elementRef: ElementRef, ionicConfig: IonicConfig, @Host() aside: Aside) {
+ super(elementRef, ionicConfig);
+
+ aside.backdrop = this;
+
+ this.aside = aside;
+
+ this.backgroundColor = 'rgba(0,0,0,0)';
+ }
+ onInit() {
+ let ww = window.innerWidth;
+ let wh = window.innerHeight;
+ this.width = ww + 'px';
+ this.height = wh + 'px';
+ }
+ clicked(event) {
+ this.aside.close();
+ }
+}
diff --git a/ionic/components/aside/extensions/gestures.ts b/ionic/components/aside/extensions/gestures.ts
index a835e7acb8..efd2efc5c4 100644
--- a/ionic/components/aside/extensions/gestures.ts
+++ b/ionic/components/aside/extensions/gestures.ts
@@ -25,13 +25,17 @@ class AsideTargetGesture extends SlideEdgeGesture {
}
onSlide(slide, ev) {
this.aside.setOpenAmt(slide.distance / slide.max);
- this.aside.setTransform('translate3d(' + slide.distance + 'px,0,0)');
+ this.aside.setTransform(slide.distance);
}
onSlideEnd(slide, ev) {
- this.aside.setTransform('');
this.aside.setSliding(false);
if (Math.abs(ev.gesture.velocityX) > 0.2 || Math.abs(slide.delta) > Math.abs(slide.max) * 0.5) {
+
this.aside.setOpen(!this.aside.isOpen);
+ this.aside.setDoneTransforming(!this.aside.isOpen);
+
+ } else {
+ this.aside.setDoneTransforming(this.aside.isOpen);
}
}
@@ -78,13 +82,15 @@ class AsideGesture extends SlideEdgeGesture {
}
onSlide(slide, ev) {
this.aside.setOpenAmt(slide.distance / slide.max);
- this.aside.setTransform('translate3d(' + slide.distance + 'px,0,0)');
+ this.aside.setTransform(slide.distance);
}
onSlideEnd(slide, ev) {
- this.aside.setTransform('');
this.aside.setSliding(false);
if (Math.abs(ev.gesture.velocityX) > 0.2 || Math.abs(slide.delta) > Math.abs(slide.max) * 0.5) {
this.aside.setOpen(!this.aside.isOpen);
+ this.aside.setDoneTransforming(!this.aside.isOpen);
+ } else {
+ this.aside.setDoneTransforming(false);
}
}
@@ -114,9 +120,11 @@ export class RightAsideGesture extends LeftAsideGesture {
}
+/*
+ Not supported right now
export class TopAsideGesture extends AsideGesture {
onSlide(slide, ev) {
- this.aside.setTransform('translate3d(0,' + slide.distance + 'px,0)');
+ this.aside.setTransform(slide.distance);
}
getSlideBoundaries() {
return {
@@ -137,3 +145,4 @@ export class BottomAsideGesture extends TopAsideGesture {
};
}
}
+*/
diff --git a/ionic/components/aside/extensions/types.ts b/ionic/components/aside/extensions/types.ts
index b397dd5aa3..b34eab1a17 100644
--- a/ionic/components/aside/extensions/types.ts
+++ b/ionic/components/aside/extensions/types.ts
@@ -10,7 +10,11 @@ const asideManipulator = {
this.aside.getNativeElement().classList[open ? 'add' : 'remove']('open');
},
setTransform(t) {
- this.aside.getNativeElement().style[CSS.transform] = t;
+ if(t === null) {
+ this.aside.getNativeElement().style[CSS.transform] = '';
+ } else {
+ this.aside.getNativeElement().style[CSS.transform] = 'translate3d(' + t + 'px,0,0)';
+ }
}
}
const contentManipulator = {
@@ -23,7 +27,29 @@ const contentManipulator = {
)
},
setTransform(t) {
- this.aside.contentElement.style[CSS.transform] = t;
+ if(t === null) {
+ this.aside.contentElement.style[CSS.transform] = '';
+ } else {
+ this.aside.contentElement.style[CSS.transform] = 'translate3d(' + t + 'px,0,0)';
+ }
+ }
+}
+
+const backdropManipulator = {
+ setSliding(sliding) {
+ this.aside.backdrop.isTransitioning = sliding;
+ //.classList[sliding ? 'add' : 'remove']('no-transition');
+ },
+ setOpen(open) {
+ let amt = open ? 0.6 : 0;
+ this.aside.backdrop.backgroundColor = 'rgba(0,0,0,' + amt + ')';
+ },
+ setTransform(t) {
+ if(t === null) {
+ t = this.aside.width();
+ }
+ let fade = 0.6 * t / this.aside.width();
+ this.aside.backdrop.backgroundColor = 'rgba(0,0,0,' + fade + ')';
}
}
@@ -31,7 +57,6 @@ export class AsideType {
constructor(aside: Aside) {
this.aside = aside;
- //FIXME(ajoslin): have to wait for for bindings to apply in a component
setTimeout(() => {
aside.contentElement.classList.add('aside-content')
})
@@ -41,12 +66,21 @@ export class AsideType {
export class AsideTypeOverlay extends AsideType {
setSliding(sliding) {
asideManipulator.setSliding.call(this, sliding);
+ backdropManipulator.setSliding.call(this, sliding);
}
setOpen(open) {
asideManipulator.setOpen.call(this, open);
+ backdropManipulator.setOpen.call(this, open);
}
setTransform(t) {
asideManipulator.setTransform.call(this, t);
+ backdropManipulator.setTransform.call(this, t);
+ }
+ setDoneTransforming(willOpen) {
+ asideManipulator.setTransform.call(this, null);
+ backdropManipulator.setTransform.call(this, null);
+ asideManipulator.setOpen.call(this, willOpen);
+ backdropManipulator.setOpen.call(this, willOpen);
}
}
@@ -63,6 +97,12 @@ export class AsideTypePush extends AsideType {
asideManipulator.setTransform.call(this, t);
contentManipulator.setTransform.call(this, t);
}
+ setDoneTransforming(willOpen) {
+ asideManipulator.setOpen.call(this, willOpen);
+ asideManipulator.setTransform.call(this, null);
+ contentManipulator.setOpen.call(this, willOpen);
+ contentManipulator.setTransform.call(this, null);
+ }
}
export class AsideTypeReveal extends AsideType {
@@ -75,4 +115,8 @@ export class AsideTypeReveal extends AsideType {
setTransform(t) {
contentManipulator.setTransform.call(this, t);
}
+ setDoneTransforming(willOpen) {
+ contentManipulator.setOpen.call(this, willOpen);
+ contentManipulator.setTransform.call(this, null);
+ }
}