diff --git a/.jshintrc b/.jshintrc
index 77ba89791e..c4ba3654d3 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -1,4 +1,5 @@
{
"esnext": true,
- "expr": true
+ "expr": true,
+ "asi": true
}
diff --git a/gulpfile.js b/gulpfile.js
index a17dbd41c3..5d8e5bd226 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -55,7 +55,7 @@ gulp.task('clean', function(done) {
del([buildConfig.dist], done);
});
-gulp.task('e2e', function() {
+gulp.task('e2e', ['sass'], function() {
var e2eSrc = path.join(__dirname, 'src/components/**/test/**/*');
var templateSrc = path.join(__dirname, 'scripts/e2e/index.template.html');
var e2eDest = path.join(__dirname, 'dist/e2e/');
@@ -93,15 +93,8 @@ gulp.task('ng2-rename', function(done) {
gulp.task('ng2', ['ng2-rename'], function() {
var builder = new SystemJsBuilder();
builder.config({
- traceurOptions: {
- 'sourceMaps': true,
- 'annotations': true,
- 'types': true,
- 'script': false,
- 'memberVariables': true,
- 'modules': 'instantiate'
- },
baseURL: 'dist/lib',
+ traceurOptions: buildConfig.traceurOptions,
map: {
rx: __dirname + '/node_modules/rx'
}
diff --git a/scripts/build/config.js b/scripts/build/config.js
index ed486ddfc1..511cfa6b88 100644
--- a/scripts/build/config.js
+++ b/scripts/build/config.js
@@ -7,5 +7,13 @@ module.exports = {
html: 'src/**/*.html',
scss: 'src/components/**/*.scss',
},
+ traceurOptions: {
+ 'sourceMaps': true,
+ 'annotations': true,
+ 'types': true,
+ 'script': false,
+ 'memberVariables': true,
+ 'modules': 'instantiate'
+ },
protractorPort: 8876
};
diff --git a/src/components/app/_scaffolding.scss b/src/components/app/_scaffolding.scss
index 8b2bd06534..1a8d24378b 100644
--- a/src/components/app/_scaffolding.scss
+++ b/src/components/app/_scaffolding.scss
@@ -15,6 +15,7 @@ html {
.pane {
position: relative;
+ height: 100%;
width: 100%;
@include flex-display();
diff --git a/src/components/app/_util.scss b/src/components/app/_util.scss
index e2b5f8e977..e3b38db172 100644
--- a/src/components/app/_util.scss
+++ b/src/components/app/_util.scss
@@ -1,4 +1,8 @@
+.notransition {
+ transition: none !important;
+}
+
.hide.hide.hide {
display: none;
}
diff --git a/src/components/app/ionic.scss b/src/components/app/ionic.scss
index 6ff632a037..b043e39ec6 100644
--- a/src/components/app/ionic.scss
+++ b/src/components/app/ionic.scss
@@ -24,12 +24,14 @@
@import
"../aside/aside",
"../button/button",
+ "../content/content",
"../item/item",
"../list/list",
"../modal/modal",
"../switch/switch",
"../tabs/tabs",
- "../toolbar/toolbar";
+ "../toolbar/toolbar",
+ "../view/view";
// Android Components
diff --git a/src/components/aside/aside-gestures.js b/src/components/aside/aside-gestures.js
new file mode 100644
index 0000000000..db0ca1f4a2
--- /dev/null
+++ b/src/components/aside/aside-gestures.js
@@ -0,0 +1,88 @@
+import {AsideConfig, Aside} from './aside';
+import {SlideEdgeGesture} from '../../core/gestures/slide-edge-gesture';
+
+class AsideGesture extends SlideEdgeGesture {
+ constructor(aside: Aside) {
+ this.aside = aside;
+ this.slideElement = aside.domElement.parentNode;
+ super(this.slideElement, {
+ direction: (aside.side === 'left' || aside.side === 'right') ? 'x' : 'y',
+ edge: aside.side,
+ threshold: 75
+ });
+ this.listen();
+ }
+
+ canStart(ev) {
+ // Only restrict edges if the aside is closed
+ return this.aside.isOpen ? true : super.canStart(ev);
+ }
+
+ onSlideBeforeStart(slide, ev) {
+ console.log('beforestart');
+ this.aside.setSliding(true);
+ this.aside.setChanging(true);
+ return new Promise(resolve => {
+ requestAnimationFrame(resolve);
+ });
+ }
+ onSlide(slide, ev) {
+ this.aside.setTransform('translate3d(' + slide.distance + 'px,0,0)');
+ }
+ onSlideEnd(slide, ev) {
+ this.aside.setTransform('');
+ this.aside.setSliding(false);
+ if (Math.abs(ev.velocityX) > 0.2 || Math.abs(slide.delta) > Math.abs(slide.max) * 0.5) {
+ this.aside.setOpen(!this.aside.isOpen);
+ }
+ }
+
+ getElementStartPos(slide, ev) {
+ return this.aside.isOpen ? slide.max : slide.min;
+ }
+ getSlideBoundaries() {
+ return {
+ min: 0,
+ max: this.aside.domElement.offsetWidth
+ };
+ }
+}
+
+export class LeftAsideGesture extends AsideGesture {}
+
+export class RightAsideGesture extends LeftAsideGesture {
+ getElementStartPos(slide, ev) {
+ return this.aside.isOpen ? slide.min : slide.max;
+ }
+ getSlideBoundaries() {
+ return {
+ min: -this.aside.domElement.offsetWidth,
+ max: 0
+ };
+ }
+
+}
+
+export class TopAsideGesture extends AsideGesture {
+ onSlide(slide, ev) {
+ this.aside.setTransform('translate3d(0,' + slide.distance + 'px,0)');
+ }
+ getSlideBoundaries() {
+ return {
+ min: 0,
+ max: this.aside.domElement.offsetHeight
+ };
+ }
+}
+
+export class BottomAsideGesture extends TopAsideGesture {
+ getElementStartPos(slide, ev) {
+ return this.aside.isOpen ? slide.min : slide.max;
+ }
+ getSlideBoundaries() {
+ return {
+ min: -this.aside.domElement.offsetHeight,
+ max: 0
+ };
+ }
+}
diff --git a/src/components/aside/aside.js b/src/components/aside/aside.js
index c7c3710b63..635348c7fe 100644
--- a/src/components/aside/aside.js
+++ b/src/components/aside/aside.js
@@ -1,158 +1,81 @@
-import {Component, Template, Inject, Parent, NgElement} from 'angular2/angular2';
-import {Ion} from '../ion';
-import {Config} from '../../core/config/config';
-import {SlideEdgeGesture} from '../../core/gestures/slide-edge-gesture';
-import * as util from '../../util';
+import {Component, Template, Inject, Parent, NgElement, PropertySetter} from 'angular2/angular2'
+import {ComponentConfig} from '../../core/config/config'
+import * as types from './extensions/types/types'
+import * as gestures from './extensions/gestures/gestures';
-// AsideParent is just a temporary directive
-@Component({
- selector: 'ion-aside-parent'
-})
-@Template({
- inline: ''
-})
-export class AsideParent {
- constructor(@NgElement() element: NgElement) {
- this.domElement = element.domElement;
- super();
- }
-}
+export let AsideConfig = new ComponentConfig()
+
+AsideConfig.property('side')
+ .when('left', gestures.LeftAsideGesture)
+ .when('right', gestures.RightAsideGesture)
+ .when('top', gestures.TopAsideGesture)
+ .when('bottom', gestures.BottomAsideGesture)
+
+AsideConfig.property('type')
+ .when('overlay', types.AsideOverlayType)
+ .when('push', types.AsidePushType)
+ .when('reveal', types.AsideRevealType)
@Component({
selector: 'ion-aside',
bind: {
+ content: 'content',
side: 'side',
dragThreshold: 'dragThreshold'
- }
+ },
+ services: [AsideConfig]
})
@Template({
inline: ``
})
export class Aside {
constructor(
- @Parent() asideParent: AsideParent,
- @NgElement() element: NgElement
+ @NgElement() element: NgElement,
+ @PropertySetter('style.transform') transformSetter: Function,
+ @PropertySetter('class.notransition') noTransitionSetter: Function,
+ config: AsideConfig
) {
- this.domElement = element.domElement;
+ this.domElement = element.domElement
+ this.transformSetter = transformSetter
+ // this.noTransitionSetter = noTransitionSetter
+ this.noTransitionSetter = is => { this.domElement.classList[is?'add':'remove']('notransition') }
+
+ this.openSetter = is => { this.domElement.classList[is?'add':'remove']('open') }
+
+ // TODO inject constant instead of using domElement.getAttribute
+ // TODO let config / platform handle defaults transparently
+ let side = this.side = this.domElement.getAttribute('side') || 'left'
+ let type = this.type = this.domElement.getAttribute('type') || 'overlay'
+ this.delegates = config.invoke(this, { side, type })
+
+ this.domElement.classList.add(side)
this.domElement.addEventListener('transitionend', ev => {
- this.setChanging(false);
+ this.setChanging(false)
})
+ }
- // TODO: remove this. setTimeout has to be done so the bindings can be applied
- setTimeout(() => {
- let GestureConstructor = {
- left: LeftAsideSlideGesture,
- top: TopAsideSlideGesture,
- bottom: BottomAsideSlideGesture,
- right: RightAsideSlideGesture
- }[this.side];
- this.domElement.classList.add(this.side);
- this.gesture = new GestureConstructor(this, asideParent.domElement);
- this.gesture.listen();
- });
+ setTransform(transform) {
+ this.delegates.type.setTransform(transform)
}
setSliding(isSliding) {
if (isSliding !== this.isSliding) {
- this.domElement.classList[isSliding ? 'add' : 'remove']('sliding');
+ this.delegates.type.setSliding(isSliding)
}
}
setChanging(isChanging) {
if (isChanging !== this.isChanging) {
- this.isChanging = isChanging;
- this.domElement.classList[isChanging ? 'add' : 'remove']('changing');
+ this.isChanging = isChanging
+ this.domElement.classList[isChanging ? 'add' : 'remove']('changing')
}
}
setOpen(isOpen) {
if (isOpen !== this.isOpen) {
- this.isOpen = isOpen;
- this.setChanging(true);
+ this.isOpen = isOpen
+ this.setChanging(true)
requestAnimationFrame(() => {
- this.domElement.classList[isOpen ? 'add' : 'remove']('open');
+ this.delegates.type.setOpen(isOpen)
})
}
}
}
-
-class AsideSlideGesture extends SlideEdgeGesture {
- constructor(aside: Aside, slideElement: Element) {
- this.aside = aside;
- super(slideElement, {
- direction: (aside.side === 'left' || aside.side === 'right') ? 'x' : 'y',
- edge: aside.side || 'left',
- threshold: /*aside.dragThreshold || */150
- });
- }
-
- canStart(ev) {
- // Only restrict edges if the aside is closed
- return this.aside.isOpen ? true : super.canStart(ev);
- }
-
- onSlideBeforeStart(slide, ev) {
- this.aside.setSliding(true);
- this.aside.setChanging(true);
- return new Promise(resolve => {
- requestAnimationFrame(resolve);
- });
- }
- onSlide(slide, ev) {
- this.aside.domElement.style.transform = 'translate3d(' + slide.distance + 'px,0,0)';
- }
- onSlideEnd(slide, ev) {
- this.aside.domElement.style.transform = '';
- this.aside.setSliding(false);
- if (Math.abs(ev.velocityX) > 0.2 || Math.abs(slide.delta) > Math.abs(slide.max) * 0.5) {
- this.aside.setOpen(!this.aside.isOpen);
- }
- }
-
- getElementStartPos(slide, ev) {
- return this.aside.isOpen ? slide.max : slide.min;
- }
- getSlideBoundaries() {
- return {
- min: 0,
- max: this.aside.domElement.offsetWidth
- };
- }
-}
-
-class LeftAsideSlideGesture extends AsideSlideGesture {}
-
-class RightAsideSlideGesture extends LeftAsideSlideGesture {
- getElementStartPos(slide, ev) {
- return this.aside.isOpen ? slide.min : slide.max;
- }
- getSlideBoundaries() {
- return {
- min: -this.aside.domElement.offsetWidth,
- max: 0
- };
- }
-
-}
-
-class TopAsideSlideGesture extends AsideSlideGesture {
- onSlide(slide, ev) {
- this.aside.domElement.style.transform = 'translate3d(0,' + slide.distance + 'px,0)';
- }
- getSlideBoundaries() {
- return {
- min: 0,
- max: this.aside.domElement.offsetHeight
- };
- }
-}
-
-class BottomAsideSlideGesture extends TopAsideSlideGesture {
- getElementStartPos(slide, ev) {
- return this.aside.isOpen ? slide.min : slide.max;
- }
- getSlideBoundaries() {
- return {
- min: -this.aside.domElement.offsetHeight,
- max: 0
- };
- }
-}
diff --git a/src/components/aside/aside.scss b/src/components/aside/aside.scss
index 2ca4d8f740..1e3a12ad45 100644
--- a/src/components/aside/aside.scss
+++ b/src/components/aside/aside.scss
@@ -1,21 +1,22 @@
$aside-width: 304px;
$aside-height: 304px;
+$aside-transition: 0.3s linear transform;
ion-aside {
display: block;
position: absolute;
- background: rgba(255,0,0,0.5);
- border-right: 1px solid black;
+ background: #eee;
- transition: transform 0.3s;
+ &.type-overlay {
+ z-index: 10;
+ }
+
+ transition: $aside-transition;
&:not(.open):not(.changing) {
display: none;
}
- &.sliding {
- transition-duration: 0s;
- }
-
+
&.left {
width: $aside-width;
left: -$aside-width;
@@ -23,7 +24,8 @@ ion-aside {
bottom: 0;
transform: translate3d(0, 0, 0);
- &.open {
+ &.open,
+ &.type-reveal {
transform: translate3d($aside-width,0,0);
}
}
@@ -34,7 +36,8 @@ ion-aside {
bottom: 0;
transform: translate3d(0,0,0);
- &.open {
+ &.open,
+ &.type-reveal {
transform: translate3d(-$aside-width,0,0);
}
}
@@ -45,7 +48,8 @@ ion-aside {
right: 0;
transform: translate3d(0,0,0);
- &.open {
+ &.open,
+ &.type-reveal {
transform: translate3d(0,$aside-width,0);
}
}
@@ -56,13 +60,25 @@ ion-aside {
right: 0;
transform: translate3d(0,0,0);
- &.open {
+ &.open,
+ &.type-reveal {
transform: translate3d(0,-$aside-width,0);
}
}
}
+.aside-content {
+ transition: $aside-transition;
+ transform: translate3d(0,0,0);
+ &.aside-open-left {
+ transform: translate3d($aside-width,0,0);
+ }
+ &.aside-open-right {
+ transform: translate3d(-$aside-width,0,0);
+ }
+}
+
ion-aside-parent {
position: absolute;
top: 0;
diff --git a/src/components/aside/extensions/gestures/gestures.js b/src/components/aside/extensions/gestures/gestures.js
new file mode 100644
index 0000000000..4da2b2f067
--- /dev/null
+++ b/src/components/aside/extensions/gestures/gestures.js
@@ -0,0 +1,88 @@
+import {Aside} from '../../aside';
+import {SlideEdgeGesture} from '../../../../core/gestures/slide-edge-gesture';
+
+class AsideGesture extends SlideEdgeGesture {
+ constructor(aside: Aside) {
+ this.aside = aside;
+ this.slideElement = aside.domElement.parentNode;
+ super(this.slideElement, {
+ direction: (aside.side === 'left' || aside.side === 'right') ? 'x' : 'y',
+ edge: aside.side,
+ threshold: 75
+ });
+ this.listen();
+ }
+
+ canStart(ev) {
+ // Only restrict edges if the aside is closed
+ return this.aside.isOpen ? true : super.canStart(ev);
+ }
+
+ onSlideBeforeStart(slide, ev) {
+ console.log('beforestart');
+ this.aside.setSliding(true);
+ this.aside.setChanging(true);
+ return new Promise(resolve => {
+ requestAnimationFrame(resolve);
+ });
+ }
+ onSlide(slide, ev) {
+ this.aside.setTransform('translate3d(' + slide.distance + 'px,0,0)');
+ }
+ onSlideEnd(slide, ev) {
+ this.aside.setTransform('');
+ this.aside.setSliding(false);
+ if (Math.abs(ev.velocityX) > 0.2 || Math.abs(slide.delta) > Math.abs(slide.max) * 0.5) {
+ this.aside.setOpen(!this.aside.isOpen);
+ }
+ }
+
+ getElementStartPos(slide, ev) {
+ return this.aside.isOpen ? slide.max : slide.min;
+ }
+ getSlideBoundaries() {
+ return {
+ min: 0,
+ max: this.aside.domElement.offsetWidth
+ };
+ }
+}
+
+export class LeftAsideGesture extends AsideGesture {}
+
+export class RightAsideGesture extends LeftAsideGesture {
+ getElementStartPos(slide, ev) {
+ return this.aside.isOpen ? slide.min : slide.max;
+ }
+ getSlideBoundaries() {
+ return {
+ min: -this.aside.domElement.offsetWidth,
+ max: 0
+ };
+ }
+
+}
+
+export class TopAsideGesture extends AsideGesture {
+ onSlide(slide, ev) {
+ this.aside.setTransform('translate3d(0,' + slide.distance + 'px,0)');
+ }
+ getSlideBoundaries() {
+ return {
+ min: 0,
+ max: this.aside.domElement.offsetHeight
+ };
+ }
+}
+
+export class BottomAsideGesture extends TopAsideGesture {
+ getElementStartPos(slide, ev) {
+ return this.aside.isOpen ? slide.min : slide.max;
+ }
+ getSlideBoundaries() {
+ return {
+ min: -this.aside.domElement.offsetHeight,
+ max: 0
+ };
+ }
+}
diff --git a/src/components/aside/extensions/types/types.js b/src/components/aside/extensions/types/types.js
new file mode 100644
index 0000000000..0bf28b4f7e
--- /dev/null
+++ b/src/components/aside/extensions/types/types.js
@@ -0,0 +1,56 @@
+import {Aside} from '../../aside';
+
+// TODO figure out if we can make all of these bindings (eg content's transform is bound to
+// aside component's `transform` propety
+class AsideBaseType {
+ constructor(aside: Aside) {
+ this.aside = aside;
+
+ // TODO make this a setter
+ aside.domElement.classList.add(`type-${aside.type}`);
+
+ //FIXME(ajoslin): have to wait for for bindings to apply in a component
+ setTimeout(() => {
+ this.aside.content.setIsAside(true);
+ })
+ }
+ setSliding(isSliding) {
+ this.aside.noTransitionSetter(isSliding);
+ }
+ setOpen(isOpen) {
+ this.aside.openSetter(isOpen);
+ }
+ setTransform(transform) {
+ this.aside.transformSetter(transform);
+ }
+}
+
+export class AsideOverlayType extends AsideBaseType {}
+
+export class AsidePushType extends AsideBaseType {
+ setSliding(isSliding) {
+ super.setSliding(isSliding);
+ this.aside.content.noTransitionSetter(isSliding);
+ }
+ setOpen(isOpen) {
+ super.setOpen(isOpen);
+ this.aside.content.asideOpenSetter(isOpen, this.aside.side);
+ }
+ setTransform(transform) {
+ super.setTransform(transform);
+ this.aside.content.transformSetter(transform);
+ }
+}
+
+export class AsideRevealType extends AsideBaseType {
+ setSliding(isSliding) {
+ this.aside.content.noTransitionSetter(isSliding);
+ }
+ setOpen(isOpen) {
+ super.setOpen(isOpen);
+ this.aside.content.asideOpenSetter(isOpen, this.aside.side);
+ }
+ setTransform(transform) {
+ this.aside.content.transformSetter(transform);
+ }
+}
diff --git a/src/components/aside/test/basic/index.html b/src/components/aside/test/basic/index.html
index 5837a2b5f8..c64d899eae 100644
--- a/src/components/aside/test/basic/index.html
+++ b/src/components/aside/test/basic/index.html
@@ -1,2 +1 @@
-
-
+
diff --git a/src/components/aside/test/basic/main.html b/src/components/aside/test/basic/main.html
new file mode 100644
index 0000000000..e263539827
--- /dev/null
+++ b/src/components/aside/test/basic/main.html
@@ -0,0 +1,21 @@
+
+
+ Overlay!
+ ...
+ ...
+ ...
+ This is android-ey.
+
+
+
+ HELLO, content!
+
+
+
+ Reveal!
+ ...
+ ...
+ ...
+ This is iOS-ey.
+
+
diff --git a/src/components/aside/test/basic/main.js b/src/components/aside/test/basic/main.js
index 90a20cedfc..581a565175 100644
--- a/src/components/aside/test/basic/main.js
+++ b/src/components/aside/test/basic/main.js
@@ -1,50 +1,16 @@
-import {ionicComponents} from 'ionic2/components';
+import {Aside} from 'ionic2/components/aside/aside';
+import {Content} from 'ionic2/components/content/content';
+import {View} from 'ionic2/components/view/view';
import {Template, Component, bootstrap} from 'angular2/angular2';
@Component({
selector: 'aside-app'
})
@Template({
- directives: ionicComponents,
- inline: `
-
- LEFT
- ...
- ...
- ...
- Side menu!
-
-
- RIGHT
- ...
- ...
- ...
- Side menu!
-
-
- TOP
- ...
- ...
- ...
- Side menu!
-
-
- BOTTOM
- ...
- ...
- ...
- Side menu!
-
-
-
-
-
`
+ directives: [Aside, Content, View],
+ url: 'main.html'
})
class AsideApp {
- openLeft() {
- }
}
bootstrap(AsideApp);
diff --git a/src/components/content/content.js b/src/components/content/content.js
index 4d2d34b564..fda5b900fe 100644
--- a/src/components/content/content.js
+++ b/src/components/content/content.js
@@ -1,6 +1,4 @@
-import {NgElement, Component, Template} from 'angular2/angular2';
-import {Ion} from '../ion';
-
+import {NgElement, Component, Template, PropertySetter} from 'angular2/angular2';
@Component({
selector: 'ion-content'
@@ -11,8 +9,23 @@ import {Ion} from '../ion';
`
})
-export class Content extends Ion {
- constructor(@NgElement() ele:NgElement) {
- ele.domElement.classList.add('content');
+export class Content {
+ constructor(
+ @NgElement() ele:NgElement,
+ @PropertySetter('style.transform') transformSetter: Function,
+ @PropertySetter('class.notransition') noTransitionSetter: Function
+ ) {
+ this.domElement = ele.domElement;
+ this.domElement.classList.add('content');
+
+ this.noTransitionSetter = is => { this.domElement.classList[is?'add':'remove']('notransition'); }
+ // this.noTransitionSetter = noTransitionSetter;
+
+ this.transformSetter = transformSetter;
+ this.setIsAside = is => { this.domElement.classList.add('aside-content'); };
+
+ this.asideOpenSetter = (is, side) => {
+ this.domElement.classList[is?'add':'remove'](`aside-open-${side}`);
+ }
}
}
diff --git a/src/components/content/content.scss b/src/components/content/content.scss
new file mode 100644
index 0000000000..f1015cc97e
--- /dev/null
+++ b/src/components/content/content.scss
@@ -0,0 +1,5 @@
+.content {
+ flex: 1;
+ background-color: white;
+ z-index: 1;
+}
diff --git a/src/components/toolbar/toolbar.js b/src/components/toolbar/toolbar.js
index 9738b90c38..ddffb6b4c8 100644
--- a/src/components/toolbar/toolbar.js
+++ b/src/components/toolbar/toolbar.js
@@ -1,5 +1,4 @@
import {NgElement, Component, Template} from 'angular2/angular2'
-import {Ion} from '../ion'
@Component({
selector: 'ion-toolbar',
diff --git a/src/components/view/view.js b/src/components/view/view.js
index 69c2def476..309e339bd8 100644
--- a/src/components/view/view.js
+++ b/src/components/view/view.js
@@ -1,6 +1,5 @@
import {NgElement, Component, Template} from 'angular2/angular2'
import {Toolbar} from '../toolbar/toolbar'
-import {Ion} from '../ion'
@Component({
selector: 'ion-view',
diff --git a/src/components/view/view.scss b/src/components/view/view.scss
new file mode 100644
index 0000000000..2e4e8e5a19
--- /dev/null
+++ b/src/components/view/view.scss
@@ -0,0 +1,3 @@
+.pane-container {
+ flex: 1;
+}
diff --git a/src/core/config/config.js b/src/core/config/config.js
index cab014d331..c0cff5fdf8 100644
--- a/src/core/config/config.js
+++ b/src/core/config/config.js
@@ -1,7 +1,47 @@
import {platform} from '../platform/platform';
-import {ConfigCase} from './config-case';
+// import {ConfigCase} from './config-case';
import * as util from '../../util';
+
+/*
+let MyConfig = new ComponentConfig();
+MyConfig.property('side')
+ .when('left', LeftSlideGesture)
+ .when('right', RightSlideGesture)
+ .when('top', TopSlideGesture)
+ .when('bottom', BottomSlideGesture)
+*/
+export function ComponentConfig() {
+ return class Config {
+ static property(propertyName) {
+ let self;
+ return (self = {
+ when(propertyValue, Class) {
+ Config.addCase(propertyName, propertyValue, Class);
+ return self;
+ }
+ });
+ }
+ static addCase(property, value, Class) {
+ Config.registry || (Config.registry = {});
+ (Config.registry[property] || (Config.registry[property] = {}))[value] = Class;
+ }
+ invoke(instance, properties = {}) {
+ let delegates = {};
+ for (let property in properties) {
+ let value = properties[property];
+ let propertyRegistry = Config.registry && Config.registry[property] || {};
+ if (propertyRegistry[value]) {
+ delegates[property] = new propertyRegistry[value](instance);
+ }
+ }
+ return delegates;
+ }
+ }
+
+}
+
+
// TODO stop hardcoding platforms and media sizes
/*
@@ -23,86 +63,86 @@ class AsideReveal {
}
*/
-export class Config extends ConfigCase {
- constructor() {
- this._root = this;
- this._cases = {};
- super({
- root: this,
- parent: null,
- path: ''
- });
- }
- invoke(instance) {
- return invokeConfig(this, instance);
- }
- _addCase(key, baseCase) {
- let path = baseCase._path.slice();
- path.push(key);
+// export class Config extends ConfigCase {
+// constructor() {
+// this._root = this;
+// this._cases = {};
+// super({
+// root: this,
+// parent: null,
+// path: ''
+// });
+// }
+// invoke(instance) {
+// return invokeConfig(this, instance);
+// }
+// _addCase(key, baseCase) {
+// let path = baseCase._path.slice();
+// path.push(key);
- // Remove empties & duplicates
- path = path
- .filter((value, index) => {
- return value && path.indexOf(value) === index;
- })
- .sort();
+// // Remove empties & duplicates
+// path = path
+// .filter((value, index) => {
+// return value && path.indexOf(value) === index;
+// })
+// .sort();
- if (path.join(' ') === baseCase._path.join(' ')) {
- return baseCase;
- }
- return this._createCase(path);
- }
- _createCase(path) {
- if (!path.length) return this;
- let pathStr = path.join(' ');
- let configCase = this._cases[pathStr];
- if (!configCase) {
- let parentPath = path.slice(0, path.length - 1);
- configCase = this._cases[pathStr] = new ConfigCase({
- root: this,
- parent: this._createCase(parentPath),
- path: path
- });
- }
- return configCase;
- }
-}
+// if (path.join(' ') === baseCase._path.join(' ')) {
+// return baseCase;
+// }
+// return this._createCase(path);
+// }
+// _createCase(path) {
+// if (!path.length) return this;
+// let pathStr = path.join(' ');
+// let configCase = this._cases[pathStr];
+// if (!configCase) {
+// let parentPath = path.slice(0, path.length - 1);
+// configCase = this._cases[pathStr] = new ConfigCase({
+// root: this,
+// parent: this._createCase(parentPath),
+// path: path
+// });
+// }
+// return configCase;
+// }
+// }
-export function invokeConfig(config, object) {
- let platformName = platform.get().name;
+// export function invokeConfig(config, object) {
+// let platformName = platform.get().name;
- let passedCases = [config].concat(
- Object.keys(config._cases)
- .map(name => config._cases[name])
- .filter(configCasePasses)
- .sort(function(a,b) {
- return a._path.length < b._path.length ? -1 : 1;
- })
- );
+// let passedCases = [config].concat(
+// Object.keys(config._cases)
+// .map(name => config._cases[name])
+// .filter(configCasePasses)
+// .sort(function(a,b) {
+// return a._path.length < b._path.length ? -1 : 1;
+// })
+// );
- // Extend the given object with the values of all the passed cases, starting with the
- // most specific.
- let defaults = [object];
- // Also find the most specific case with a component that we should use.
- let ComponentToUse;
- for (let i = 0, ii = passedCases.length; i < ii; i++) {
- defaults.push(passedCases[i]._values);
- if (passedCases[i]._component) {
- ComponentToUse = passedCases[i]._component;
- }
- }
+// // Extend the given object with the values of all the passed cases, starting with the
+// // most specific.
+// let defaults = [object];
+// // Also find the most specific case with a component that we should use.
+// let ComponentToUse;
+// for (let i = 0, ii = passedCases.length; i < ii; i++) {
+// defaults.push(passedCases[i]._values);
+// if (passedCases[i]._component) {
+// ComponentToUse = passedCases[i]._component;
+// }
+// }
- util.defaults.apply(null, defaults);
+// util.defaults.apply(null, defaults);
- return ComponentToUse;
+// return ComponentToUse;
- function configCasePasses(configCase) {
- let path = configCase._path;
- let key;
- for (let i = 0, ii = path.length; i < ii; i++) {
- if (platformName !== path[i]) return false;
- }
- return true;
- }
+// function configCasePasses(configCase) {
+// let path = configCase._path;
+// let key;
+// for (let i = 0, ii = path.length; i < ii; i++) {
+// if (platformName !== path[i]) return false;
+// }
+// return true;
+// }
-}
+// }