| Index: pkg/polymer/lib/elements/polymer-layout/polymer-slide.html
|
| diff --git a/pkg/polymer/lib/elements/polymer-layout/polymer-slide.html b/pkg/polymer/lib/elements/polymer-layout/polymer-slide.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7c6c829b6e42739e503d328a2e164806de795267
|
| --- /dev/null
|
| +++ b/pkg/polymer/lib/elements/polymer-layout/polymer-slide.html
|
| @@ -0,0 +1,155 @@
|
| +<!--
|
| +Copyright 2013 The Polymer Authors. All rights reserved.
|
| +Use of this source code is governed by a BSD-style
|
| +license that can be found in the LICENSE file.
|
| +-->
|
| +<link rel="import" href="../polymer/polymer.html">
|
| +
|
| +<polymer-element name="polymer-slide" attributes="open closed vertical target targetId">
|
| + <template>
|
| + <style>
|
| + :host {
|
| + display: none;
|
| + }
|
| + </style>
|
| + </template>
|
| + <script>
|
| + Polymer('polymer-slide', {
|
| + closed: false,
|
| + open: true,
|
| + vertical: false,
|
| + targetId: '',
|
| + target: null,
|
| + ready: function() {
|
| + this.setAttribute('nolayout', '');
|
| + },
|
| + enteredView: function() {
|
| + this.target = this.parentNode;
|
| + },
|
| + targetIdChanged: function() {
|
| + var p = this.parentNode;
|
| + while (p.parentNode) {p = p.parentNode;};
|
| + this.target = p.querySelector('#' + this.targetId);
|
| + },
|
| + targetChanged: function() {
|
| + if (this.closed) {
|
| + this.asyncMethod(this.update);
|
| + }
|
| + },
|
| + toggle: function() {
|
| + this.open = !this.open;
|
| + },
|
| + closedChanged: function() {
|
| + this.open = !this.closed;
|
| + },
|
| + openChanged: function() {
|
| + this.asyncMethod(this.update);
|
| + },
|
| + update: function() {
|
| + this.closed = !this.open;
|
| + if (this.target) {
|
| + if (this.vertical) {
|
| + if (this.target.style.top !== '') {
|
| + this.updateTop();
|
| + } else {
|
| + this.updateBottom();
|
| + }
|
| + } else {
|
| + if (this.target.style.left !== '') {
|
| + this.updateLeft();
|
| + } else {
|
| + this.updateRight();
|
| + }
|
| + }
|
| + }
|
| + },
|
| + updateLeft: function() {
|
| + var w = this.target.offsetWidth;
|
| + var l = this.open ? 0 : -w;
|
| + this.target.style.left = l + 'px';
|
| + var s = this.target.nextElementSibling;
|
| + while (s) {
|
| + if (!s.hasAttribute('nolayout')) {
|
| + if (s.style.left === '' && s.style.right !== '') {
|
| + break;
|
| + }
|
| + l += w;
|
| + s.style.left = l + 'px';
|
| + w = s.offsetWidth;
|
| + }
|
| + s = s.nextElementSibling;
|
| + }
|
| + },
|
| + updateRight: function() {
|
| + var w = this.target.offsetWidth;
|
| + var r = this.open ? 0 : -w;
|
| + this.target.style.right = r + 'px';
|
| + //var s = this.target.previousElementSibling;
|
| + var s = previousElementSibling(this.target);
|
| + while (s) {
|
| + if (!s.hasAttribute('nolayout')) {
|
| + if (s.style.right === '' && s.style.left !== '') {
|
| + break;
|
| + }
|
| + r += w;
|
| + s.style.right = r + 'px';
|
| + w = s.offsetWidth;
|
| + }
|
| + //if (s == s.previousElementSibling) {
|
| + // console.error(s.localName + ' is its own sibling', s);
|
| + // break;
|
| + //}
|
| + //s = s.previousElementSibling;
|
| + s = previousElementSibling(s);
|
| + }
|
| + },
|
| + updateTop: function() {
|
| + var h = this.target.offsetHeight;
|
| + var t = this.open ? 0 : -h;
|
| + this.target.style.top = t + 'px';
|
| + var s = this.target.nextElementSibling;
|
| + while (s) {
|
| + if (!s.hasAttribute('nolayout')) {
|
| + if (s.style.top === '' && s.style.bottom !== '') {
|
| + break;
|
| + }
|
| + t += h;
|
| + s.style.top = t + 'px';
|
| + h = s.offsetHeight;
|
| + }
|
| + s = s.nextElementSibling;
|
| + }
|
| + },
|
| + updateBottom: function() {
|
| + var h = this.target.offsetHeight;
|
| + var b = this.open ? 0 : -h;
|
| + this.target.style.bottom = b + 'px';
|
| + //var s = this.target.previousElementSibling;
|
| + var s = previousElementSibling(this.target);
|
| + while (s) {
|
| + if (!s.hasAttribute('nolayout')) {
|
| + if (s.style.bottom === '' && s.style.top !== '') {
|
| + break;
|
| + }
|
| + b = b + h;
|
| + s.style.bottom = b + 'px';
|
| + h = s.offsetHeight;
|
| + }
|
| + //if (s == s.previousElementSibling) {
|
| + // console.error(s.localName + ' is its own sibling', s);
|
| + // break;
|
| + //}
|
| + //s = s.previousElementSibling;
|
| + s = previousElementSibling(s);
|
| + }
|
| + }
|
| + });
|
| + // TODO(sjmiles): temporary workaround for b0rked property in ShadowDOMPolyfill
|
| + function previousElementSibling(e) {
|
| + do {
|
| + e = e.previousSibling;
|
| + } while (e && e.nodeType !== Node.ELEMENT_NODE);
|
| + return e;
|
| + };
|
| + </script>
|
| +</polymer-element>
|
|
|