• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1
2
3(function () {
4
5// create some basic transition styling data.
6var transitions = CoreStyle.g.transitions = CoreStyle.g.transitions || {};
7transitions.duration = '500ms';
8transitions.heroDelay = '50ms';
9transitions.scaleDelay = '500ms';
10transitions.cascadeFadeDuration = '250ms';
11
12Polymer('core-transition-pages',{
13
14  publish: {
15    /**
16     * This class will be applied to the scope element in the `prepare` function.
17     * It is removed in the `complete` function. Used to activate a set of CSS
18     * rules that need to apply before the transition runs, e.g. a default opacity
19     * or transform for the non-active pages.
20     *
21     * @attribute scopeClass
22     * @type string
23     * @default ''
24     */
25    scopeClass: '',
26
27    /**
28     * This class will be applied to the scope element in the `go` function. It is
29     * remoived in the `complete' function. Generally used to apply a CSS transition
30     * rule only during the transition.
31     *
32     * @attribute activeClass
33     * @type string
34     * @default ''
35     */
36    activeClass: '',
37
38    /**
39     * Specifies which CSS property to look for when it receives a `transitionEnd` event
40     * to determine whether the transition is complete. If not specified, the first
41     * transitionEnd event received will complete the transition.
42     *
43     * @attribute transitionProperty
44     * @type string
45     * @default ''
46     */
47    transitionProperty: ''
48  },
49
50  /**
51   * True if this transition is complete.
52   *
53   * @attribute completed
54   * @type boolean
55   * @default false
56   */
57  completed: false,
58
59  prepare: function(scope, options) {
60    this.boundCompleteFn = this.complete.bind(this, scope);
61    if (this.scopeClass) {
62      scope.classList.add(this.scopeClass);
63    }
64  },
65
66  go: function(scope, options) {
67    this.completed = false;
68    if (this.activeClass) {
69      scope.classList.add(this.activeClass);
70    }
71    scope.addEventListener('transitionend', this.boundCompleteFn, false);
72  },
73
74  setup: function(scope) {
75    if (!scope._pageTransitionStyles) {
76      scope._pageTransitionStyles = {};
77    }
78
79    var name = this.calcStyleName();
80
81    if (!scope._pageTransitionStyles[name]) {
82      this.installStyleInScope(scope, name);
83      scope._pageTransitionStyles[name] = true;
84    }
85  },
86
87  calcStyleName: function() {
88    return this.id || this.localName;
89  },
90
91  installStyleInScope: function(scope, id) {
92    if (!scope.shadowRoot) {
93      scope.createShadowRoot().innerHTML = '<content></content>';
94    }
95    var root = scope.shadowRoot;
96    var scopeStyle = document.createElement('core-style');
97    root.insertBefore(scopeStyle, root.firstChild);
98    scopeStyle.applyRef(id);
99  },
100
101  complete: function(scope, e) {
102    // TODO(yvonne): hack, need to manage completion better
103    if (e.propertyName !== 'box-shadow' && (!this.transitionProperty || e.propertyName.indexOf(this.transitionProperty) !== -1)) {
104      this.completed = true;
105      this.fire('core-transitionend', this, scope);
106    }
107  },
108
109  // TODO(sorvell): ideally we do this in complete.
110  ensureComplete: function(scope) {
111    scope.removeEventListener('transitionend', this.boundCompleteFn, false);
112    if (this.scopeClass) {
113      scope.classList.remove(this.scopeClass);
114    }
115    if (this.activeClass) {
116      scope.classList.remove(this.activeClass);
117    }
118  }
119
120});
121
122})();
123
124