Index: third_party/polymer/v0_8/components/neon-animation/neon-animated-pages.html |
diff --git a/third_party/polymer/v0_8/components/neon-animation/neon-animated-pages.html b/third_party/polymer/v0_8/components/neon-animation/neon-animated-pages.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3a5259d54992e6c958b818b42fce37a9f80cfe1a |
--- /dev/null |
+++ b/third_party/polymer/v0_8/components/neon-animation/neon-animated-pages.html |
@@ -0,0 +1,208 @@ |
+<!-- |
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved. |
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt |
+Code distributed by Google as part of the polymer project is also |
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt |
+--> |
+<link rel="import" href="../polymer/polymer.html"> |
+<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html"> |
+<link rel="import" href="../iron-selector/iron-selectable.html"> |
+<link rel="import" href="../paper-styles/paper-styles.html"> |
+<link rel="import" href="neon-animation-runner-behavior.html"> |
+<link rel="import" href="animations/opaque-animation.html"> |
+ |
+<!-- |
+`neon-animated-pages` manages a set of pages and runs an animation when switching between them. Its |
+children pages should implement `Polymer.NeonAnimatableBehavior` and define `entry` and `exit` |
+animations to be run when switching to or switching out of the page. |
+ |
+@group Neon Elements |
+@element neon-animated-pages |
+@demo demo/index.html |
+--> |
+ |
+<dom-module id="neon-animated-pages"> |
+ |
+ <style> |
+ |
+ :host { |
+ display: block; |
+ position: relative; |
+ } |
+ |
+ :host > ::content > * { |
+ @apply(--layout-fit); |
+ height: 100%; |
+ } |
+ |
+ :host > ::content > :not(.iron-selected):not(.neon-animating) { |
+ display: none !important; |
+ } |
+ |
+ :host > ::content > .neon-animating { |
+ pointer-events: none; |
+ } |
+ |
+ </style> |
+ |
+ <template> |
+ <content id="content"></content> |
+ </template> |
+ |
+</dom-module> |
+ |
+<script> |
+(function() { |
+ |
+ Polymer({ |
+ |
+ is: 'neon-animated-pages', |
+ |
+ behaviors: [ |
+ Polymer.IronResizableBehavior, |
+ Polymer.IronSelectableBehavior, |
+ Polymer.NeonAnimationRunnerBehavior |
+ ], |
+ |
+ properties: { |
+ |
+ activateEvent: { |
+ type: String, |
+ value: '' |
+ }, |
+ |
+ // if true, the initial page selection will also be animated according to its animation config. |
+ animateInitialSelection: { |
+ type: Boolean, |
+ value: false |
+ } |
+ |
+ }, |
+ |
+ observers: [ |
+ '_selectedChanged(selected)' |
+ ], |
+ |
+ listeners: { |
+ 'neon-animation-finish': '_onNeonAnimationFinish' |
+ }, |
+ |
+ _selectedChanged: function(selected) { |
+ |
+ var selectedPage = this.selectedItem; |
+ var oldPage = this._prevSelected || false; |
+ this._prevSelected = selectedPage; |
+ |
+ // on initial load and if animateInitialSelection is negated, simply display selectedPage. |
+ if (!oldPage && !this.animateInitialSelection) { |
+ this._completeSelectedChanged(); |
+ return; |
+ } |
+ |
+ // insert safari fix. |
+ this.animationConfig = [{ |
+ name: 'opaque-animation', |
+ node: selectedPage |
+ }]; |
+ |
+ // configure selectedPage animations. |
+ if (this.entryAnimation) { |
+ this.animationConfig.push({ |
+ name: this.entryAnimation, |
+ node: selectedPage |
+ }); |
+ } else { |
+ if (selectedPage.getAnimationConfig) { |
+ this.animationConfig.push({ |
+ animatable: selectedPage, |
+ type: 'entry' |
+ }); |
+ } |
+ } |
+ |
+ // configure oldPage animations iff exists. |
+ if (oldPage) { |
+ |
+ // cancel the currently running animation if one is ongoing. |
+ if (oldPage.classList.contains('neon-animating')) { |
+ this._squelchNextFinishEvent = true; |
+ this.cancelAnimation(); |
+ this._completeSelectedChanged(); |
+ } |
+ |
+ // configure the animation. |
+ if (this.exitAnimation) { |
+ this.animationConfig.push({ |
+ name: this.exitAnimation, |
+ node: oldPage |
+ }); |
+ } else { |
+ if (oldPage.getAnimationConfig) { |
+ this.animationConfig.push({ |
+ animatable: oldPage, |
+ type: 'exit' |
+ }); |
+ } |
+ } |
+ |
+ // display the oldPage during the transition. |
+ oldPage.classList.add('neon-animating'); |
+ } |
+ |
+ // display the selectedPage during the transition. |
+ selectedPage.classList.add('neon-animating'); |
+ |
+ // actually run the animations. |
+ if (this.animationConfig.length > 1) { |
+ |
+ // on first load, ensure we run animations only after element is attached. |
+ if (!this.isAttached) { |
+ this.async(function () { |
+ this.playAnimation(null, { |
+ fromPage: null, |
+ toPage: selectedPage |
+ }); |
+ }); |
+ |
+ } else { |
+ this.playAnimation(null, { |
+ fromPage: oldPage, |
+ toPage: selectedPage |
+ }); |
+ } |
+ |
+ } else { |
+ this._completeSelectedChanged(oldPage, selectedPage); |
+ } |
+ }, |
+ |
+ _completeSelectedChanged: function(oldPage, selectedPage) { |
+ if (selectedPage) { |
+ selectedPage.classList.remove('neon-animating'); |
+ } |
+ if (oldPage) { |
+ oldPage.classList.remove('neon-animating'); |
+ } |
+ if (!selectedPage || !oldPage) { |
+ var nodes = Polymer.dom(this.$.content).getDistributedNodes(); |
+ for (var node, index = 0; node = nodes[index]; index++) { |
+ node.classList && node.classList.remove('neon-animating'); |
+ } |
+ } |
+ this.async(this.notifyResize); |
+ }, |
+ |
+ _onNeonAnimationFinish: function(event) { |
+ if (this._squelchNextFinishEvent) { |
+ this._squelchNextFinishEvent = false; |
+ return; |
+ } |
+ this._completeSelectedChanged(event.detail.fromPage, event.detail.toPage); |
+ } |
+ |
+ }) |
+ |
+})(); |
+</script> |