| Index: third_party/polymer/components/core-layout-trbl/core-layout-trbl.html
|
| diff --git a/third_party/polymer/components/core-layout-trbl/core-layout-trbl.html b/third_party/polymer/components/core-layout-trbl/core-layout-trbl.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c9ea2c606ea804d3769089eb2f623aec96d42031
|
| --- /dev/null
|
| +++ b/third_party/polymer/components/core-layout-trbl/core-layout-trbl.html
|
| @@ -0,0 +1,269 @@
|
| +<!--
|
| +Copyright (c) 2014 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
|
| +-->
|
| +
|
| +<!--
|
| +`<core-layout-trbl>` arranges nodes horizontally via absolute positioning.
|
| +Set the `vertical` attribute (boolean) to arrange vertically instead.
|
| +
|
| +`<core-layout-trbl>` arranges it's <b>sibling elements</b>, not
|
| +it's children.
|
| +
|
| +One arranged node may be marked as elastic by giving it a `flex`
|
| +attribute (boolean).
|
| +
|
| +You may remove a node from layout by giving it a `nolayout`
|
| +attribute (boolean).
|
| +
|
| +CSS Notes:
|
| +
|
| +`padding` is ignored on the parent node.
|
| +`margin` is ignored on arranged nodes.
|
| +`min-width` is ignored on arranged nodes, use `min-width` on the parent node
|
| +instead.
|
| +
|
| +Example:
|
| +
|
| +Arrange three `div` into columns. `flex` attribute on Column Two makes that
|
| +column elastic.
|
| +
|
| + <core-layout-trbl></core-layout-trbl>
|
| + <div>Column One</div>
|
| + <div flex>Column Two</div>
|
| + <div>Column Three</div>
|
| +
|
| +Remember that `<core-layout-trbl>` arranges it's sibling elements, not it's children.
|
| +
|
| +If body has width 52 device pixels (in this case, ascii characters), call that 52px.
|
| +Column One has it's natural width of 12px (including border), Column Three has it's
|
| +natural width of 14px, body border uses 2px, and Column Two automatically uses the
|
| +remaining space: 24px.
|
| +
|
| + |- 52px -|
|
| + ----------------------------------------------------
|
| + ||Column One|| Column Two ||Column Three||
|
| + ----------------------------------------------------
|
| + |- 12px -||- (24px) -|| 14px -|
|
| +
|
| +As the parent node resizes, the elastic column reacts via CSS to adjust it's size.
|
| +No javascript is used during parent resizing, for best performance.
|
| +
|
| +Changes in content or sibling size are not handled automatically.
|
| +
|
| + ----------------------------------------------------------------
|
| + ||Column One| Column Two |Column Three||
|
| + ----------------------------------------------------------------
|
| +
|
| + --------------------------------------
|
| + ||Column One|Column Two|Column Three||
|
| + --------------------------------------
|
| +
|
| +Arrange in rows by adding the `vertical` attribute.
|
| +
|
| +Example:
|
| +
|
| + <core-layout-trbl vertical></core-layout-trbl>
|
| + <div>Row One</div>
|
| + <div flex>Row Two</div>
|
| + <div>Row Three</div>
|
| +
|
| +This setup will cause Row Two to stretch to fill the container.
|
| +
|
| + ----------- -----------
|
| + |---------| |---------|
|
| + | | | |
|
| + |Row One | |Row One |
|
| + | | | |
|
| + |---------| |---------|
|
| + | | | |
|
| + |Row Two | |Row Two |
|
| + | | | |
|
| + |---------| | |
|
| + | | | |
|
| + |Row Three| | |
|
| + | | |---------|
|
| + |---------| | |
|
| + ----------- |Row Three|
|
| + | |
|
| + |---------|
|
| + |---------|
|
| +
|
| +Layouts can be nested arbitrarily.
|
| +
|
| + <core-layout-trbl></core-layout-trbl>
|
| + <div>Menu</div>
|
| + <div flex>
|
| + <core-layout-trbl vertical></core-layout-trbl>
|
| + <div>Title</div>
|
| + <div>Toolbar</div>
|
| + <div flex>Main</div>
|
| + <div>Footer</div>
|
| + </div>
|
| +
|
| +Renders something like this
|
| +
|
| + --------------------------------
|
| + ||Menu ||Title ||
|
| + || ||-----------------||
|
| + || ||Toolbar ||
|
| + || ||-----------------||
|
| + || ||Main ||
|
| + || || ||
|
| + || ||-----------------||
|
| + || ||Footer ||
|
| + --------------------------------
|
| +
|
| +@group Polymer Core Elements
|
| +@element core-layout-trbl
|
| +-->
|
| +<link rel="import" href="../polymer/polymer.html">
|
| +
|
| +<polymer-element name="core-layout-trbl" attributes="vertical">
|
| +
|
| + <template>
|
| +
|
| + <style>
|
| + :host {
|
| + display: none;
|
| + }
|
| + </style>
|
| +
|
| + </template>
|
| +
|
| + <script>
|
| +
|
| + Polymer('core-layout-trbl', {
|
| +
|
| + vertical: false,
|
| +
|
| + ready: function() {
|
| + this.setAttribute('nolayout', '');
|
| + },
|
| +
|
| + attached: function() {
|
| + this.asyncMethod(function() {
|
| + this.prepare();
|
| + this.layout();
|
| + });
|
| + },
|
| +
|
| + prepare: function() {
|
| + var parent = this.parentNode.host || this.parentNode;
|
| + // explicit position harmful on <body>
|
| + if (parent.localName !== 'body') {
|
| + // may recalc
|
| + var cs = window.getComputedStyle(parent);
|
| + if (cs.position === 'static') {
|
| + parent.style.position = 'relative';
|
| + }
|
| + //parent.style.overflow = 'hidden';
|
| + }
|
| + // changes will cause another recalc at next validation step
|
| + var stylize = this.stylize, vertical;
|
| + this.parentNode.childNodes.array().forEach(function(c, i) {
|
| + if (c.nodeType === Node.ELEMENT_NODE && !c.hasAttribute('nolayout')) {
|
| + stylize(c, {
|
| + position: 'absolute',
|
| + boxSizing: 'border-box',
|
| + MozBoxSizing: 'border-box',
|
| + });
|
| + // test for auto-vertical
|
| + if (vertical === undefined) {
|
| + vertical = (c.offsetWidth == 0 && c.offsetHeight !== 0);
|
| + }
|
| + }
|
| + });
|
| + this.vertical = this.vertical || vertical;
|
| + },
|
| +
|
| + /**
|
| + * Arrange sibling nodes end-to-end in one dimension.
|
| + *
|
| + * Arrangement is horizontal unless the `vertical`
|
| + * attribute is applied on this node.
|
| + *
|
| + * @method layout
|
| + */
|
| + layout: function() {
|
| + var parent = this.parentNode.host || this.parentNode;
|
| + var vertical = this.vertical;
|
| + var ww = 0, hh = 0, pre = [], fit, post = [];
|
| + var list = pre;
|
| + // gather element information (at most one recalc)
|
| + this.parentNode.childNodes.array().forEach(function(c, i) {
|
| + if (c.nodeType===Node.ELEMENT_NODE && !c.hasAttribute('nolayout')) {
|
| + var info = {
|
| + element: c,
|
| + w: c.offsetWidth,
|
| + h: c.offsetHeight
|
| + };
|
| + if (!c.hasAttribute('fit') && !c.hasAttribute('flex')) {
|
| + ww += c.offsetWidth;
|
| + hh += c.offsetHeight;
|
| + list.push(info);
|
| + } else {
|
| + fit = c;
|
| + list = post;
|
| + ww = hh = 0;
|
| + }
|
| + }
|
| + });
|
| + // update layout styles (invalidate, no recalc)
|
| + var v = 0;
|
| + var mxp = 0, myp = 0;
|
| + var stylize = this.stylize;
|
| + pre.forEach(function(info) {
|
| + if (vertical) {
|
| + stylize(info.element, {
|
| + top: v + 'px', right: mxp, height: info.h + 'px', left: mxp
|
| + });
|
| + } else {
|
| + stylize(info.element, {
|
| + top: myp, width: info.w + 'px', bottom: myp, left: v + 'px'
|
| + });
|
| + }
|
| + v += vertical ? info.h : info.w;
|
| + });
|
| + if (fit) {
|
| + if (vertical) {
|
| + stylize(fit, {
|
| + top: v + 'px', right: mxp, bottom: hh + 'px', left: mxp
|
| + });
|
| + } else {
|
| + stylize(fit, {
|
| + top: myp, right: ww + 'px', bottom: myp, left: v + 'px'
|
| + });
|
| + }
|
| + v = vertical ? hh : ww;
|
| + post.forEach(function(info) {
|
| + v -= vertical ? info.h : info.w;
|
| + if (vertical) {
|
| + stylize(info.element, {
|
| + height: info.h + 'px', right: mxp, bottom: v + 'px', left: mxp
|
| + });
|
| + } else {
|
| + stylize(info.element, {
|
| + top: myp, right: v + 'px', bottom: myp, width: info.w + 'px'
|
| + });
|
| + }
|
| + });
|
| + }
|
| + },
|
| +
|
| + stylize: function(element, styles) {
|
| + var style = element.style;
|
| + Object.keys(styles).forEach(function(k){
|
| + style[k] = styles[k];
|
| + });
|
| + }
|
| +
|
| + });
|
| +
|
| + </script>
|
| +
|
| +</polymer-element>
|
|
|