@@ -134,6 +134,18 @@ Polymer({
return null;
},
+ /**
+ * Produce installable clone of the SVG element matching `id` in this
+ * iconset, or `undefined` if there is no matching element.
+ * @param {string} iconName Name of the icon to apply.
+ * @param {boolean} targetIsRTL Whether the target element is RTL.
+ * @return {Element} Returns an installable clone of the SVG element
+ * matching `id`.
+ */
+ createIcon: function(iconName, targetIsRTL) {
+ return this._cloneIcon(iconName, this.rtlMirroring && targetIsRTL);
+ },
+
/**
* Remove an icon from the given element by undoing the changes effected
* by `applyIcon`.
@@ -10,7 +10,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
import '../../../shadycss/entrypoints/apply-shim.js';
import { ElementMixin } from '../mixins/element-mixin.js';
import { GestureEventListeners } from '../mixins/gesture-event-listeners.js';
-import { DirMixin } from '../mixins/dir-mixin.js';
import { dedupingMixin } from '../utils/mixin.js';
import '../utils/render-status.js';
import '../utils/unresolved.js';
@@ -42,11 +41,10 @@ export const LegacyElementMixin = dedupingMixin((base) => {
* @constructor
* @implements {Polymer_ElementMixin}
* @implements {Polymer_GestureEventListeners}
- * @implements {Polymer_DirMixin}
* @extends {HTMLElement}
* @private
*/
- const legacyElementBase = DirMixin(GestureEventListeners(ElementMixin(base)));
+ const legacyElementBase = GestureEventListeners(ElementMixin(base));
/**
* Map of simple names to touch action names
@@ -204,9 +204,7 @@ export const TemplateStamp = dedupingMixin(
if (!template._templateInfo) {
let templateInfo = template._templateInfo = {};
templateInfo.nodeInfoList = [];
- templateInfo.stripWhiteSpace =
- (outerTemplateInfo && outerTemplateInfo.stripWhiteSpace) ||
- template.hasAttribute('strip-whitespace');
+ templateInfo.stripWhiteSpace = true;
this._parseTemplateContent(template, templateInfo, {parent: null});
}
return template._templateInfo;
@@ -376,7 +376,15 @@
* there's some offset between the scrolling element and the list. For
* example: a header is placed above the list.
*/
- scrollOffset: {type: Number, value: 0}
+ scrollOffset: {type: Number, value: 0},
+
+ /**
+ * If set to true, focus on an element will be preserved after rerender.
+ */
+ preserveFocus: {
+ type: Boolean,
+ value: false
+ }
},
observers: [
@@ -1067,10 +1075,52 @@
},
/**
+ * Finds and returns the focused element (both within self and children's
+ * Shadow DOM).
+ * @return {?HTMLElement}
+ */
+ _getFocusedElement: function() {
+ function doSearch(node, query) {
+ let result = null;
+ let type = node.nodeType;
+ if (type == Node.ELEMENT_NODE || type == Node.DOCUMENT_FRAGMENT_NODE)
+ result = node.querySelector(query);
+ if (result)
+ return result;
+
+ let child = node.firstChild;
+ while (child !== null && result === null) {
+ result = doSearch(child, query);
+ child = child.nextSibling;
+ }
+ if (result)
+ return result;
+
+ const shadowRoot = node.shadowRoot;
+ return shadowRoot ? doSearch(shadowRoot, query) : null;
+ }
+
+ // Find out if any of the items are focused first, and only search
+ // recursively in the item that contains focus, to avoid a slow
+ // search of the entire list.
+ const focusWithin = doSearch(this, ':focus-within');
+ return focusWithin ? doSearch(focusWithin, ':focus') : null;
+ },
+
+ /**
* Called when the items have changed. That is, reassignments
* to `items`, splices or updates to a single item.
*/
_itemsChanged: function(change) {
+ var rendering = /^items(\.splices){0,1}$/.test(change.path);
+ var lastFocusedIndex, focusedElement;
+ if (rendering && this.preserveFocus) {
+ lastFocusedIndex = this._focusedVirtualIndex;
+ focusedElement = this._getFocusedElement();
+ }
+
+ var preservingFocus = rendering && this.preserveFocus && focusedElement;
+
if (change.path
this._virtualStart = 0;
this._physicalTop = 0;
@@ -1082,7 +1132,7 @@
this._physicalItems = this._physicalItems || [];
this._physicalSizes = this._physicalSizes || [];
this._physicalStart = 0;
- if (this._scrollTop > this._scrollOffset) {
+ if (this._scrollTop > this._scrollOffset && !preservingFocus) {
this._resetScrollPosition(0);
}
this._removeFocusedItem();
@@ -1114,6 +1164,17 @@
} else if (change.path !== 'items.length') {
this._forwardItemPath(change.path, change.value);
}
+
+ // If the list was in focus when updated, preserve the focus on item.
+ if (preservingFocus) {
+ flush();
+ focusedElement.blur(); // paper- elements breaks when focused twice.
+ this._focusPhysicalItem(
+ Math.min(this.items.length - 1, lastFocusedIndex));
+ if (!this._isIndexVisible(this._focusedVirtualIndex)) {
+ this.scrollToIndex(this._focusedVirtualIndex);
+ }
+ }
},
_forwardItemPath: function(path, value) {
@@ -13,7 +13,7 @@ import './iron-overlay-backdrop.js';
import {IronA11yKeysBehavior} from '../iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';
import {dom} from '../polymer/lib/legacy/polymer.dom.js';
-import * as gestures from '../polymer/lib/utils/gestures.js';
+import {gestures} from '../polymer/lib/utils/gestures.js';
/**
* @struct
@@ -311,12 +311,16 @@ Polymer({
/**
* Returns the target element that this tooltip is anchored to. It is
- * either the element given by the `for` attribute, or the immediate parent
- * of the tooltip.
+ * either the element given by the `for` attribute, the element manually
+ * specified through the `target` attribute, or the immediate parent of
+ * the tooltip.
*
* @type {Node}
*/
get target() {
+ if (this._manualTarget)
+ return this._manualTarget;
+
var parentNode = dom(this).parentNode;
// If the parentNode is a document fragment, then we need to use the host.
var ownerRoot = dom(this).getOwnerRoot();
@@ -331,6 +335,15 @@ Polymer({
return target;
},
+ /**
+ * Sets the target element that this tooltip will be anchored to.
+ * @param {Node} target
+ */
+ set target(target) {
+ this._manualTarget = target;
+ this._findTarget();
+ },
+
/**
* @return {void}
*/
@@ -81,81 +81,6 @@ const template = html`
--paper-red-a400: #ff1744;
--paper-red-a700: #d50000;
- --paper-pink-50: #fce4ec;
- --paper-pink-100: #f8bbd0;
- --paper-pink-200: #f48fb1;
- --paper-pink-300: #f06292;
- --paper-pink-400: #ec407a;
- --paper-pink-500: #e91e63;
- --paper-pink-600: #d81b60;
- --paper-pink-700: #c2185b;
- --paper-pink-800: #ad1457;
- --paper-pink-900: #880e4f;
- --paper-pink-a100: #ff80ab;
- --paper-pink-a200: #ff4081;
- --paper-pink-a400: #f50057;
- --paper-pink-a700: #c51162;
-
- --paper-purple-50: #f3e5f5;
- --paper-purple-100: #e1bee7;
- --paper-purple-200: #ce93d8;
- --paper-purple-300: #ba68c8;
- --paper-purple-400: #ab47bc;
- --paper-purple-500: #9c27b0;
- --paper-purple-600: #8e24aa;
- --paper-purple-700: #7b1fa2;
- --paper-purple-800: #6a1b9a;
- --paper-purple-900: #4a148c;
- --paper-purple-a100: #ea80fc;
- --paper-purple-a200: #e040fb;
- --paper-purple-a400: #d500f9;
- --paper-purple-a700: #aa00ff;
-
- --paper-deep-purple-50: #ede7f6;
- --paper-deep-purple-100: #d1c4e9;
- --paper-deep-purple-200: #b39ddb;
- --paper-deep-purple-300: #9575cd;
- --paper-deep-purple-400: #7e57c2;
- --paper-deep-purple-500: #673ab7;
- --paper-deep-purple-600: #5e35b1;
- --paper-deep-purple-700: #512da8;
- --paper-deep-purple-800: #4527a0;
- --paper-deep-purple-900: #311b92;
- --paper-deep-purple-a100: #b388ff;
- --paper-deep-purple-a200: #7c4dff;
- --paper-deep-purple-a400: #651fff;
- --paper-deep-purple-a700: #6200ea;
-
- --paper-indigo-50: #e8eaf6;
- --paper-indigo-100: #c5cae9;
- --paper-indigo-200: #9fa8da;
- --paper-indigo-300: #7986cb;
- --paper-indigo-400: #5c6bc0;
- --paper-indigo-500: #3f51b5;
- --paper-indigo-600: #3949ab;
- --paper-indigo-700: #303f9f;
- --paper-indigo-800: #283593;
- --paper-indigo-900: #1a237e;
- --paper-indigo-a100: #8c9eff;
- --paper-indigo-a200: #536dfe;
- --paper-indigo-a400: #3d5afe;
- --paper-indigo-a700: #304ffe;
-
- --paper-blue-50: #e3f2fd;
- --paper-blue-100: #bbdefb;
- --paper-blue-200: #90caf9;
- --paper-blue-300: #64b5f6;
- --paper-blue-400: #42a5f5;
- --paper-blue-500: #2196f3;
- --paper-blue-600: #1e88e5;
- --paper-blue-700: #1976d2;
- --paper-blue-800: #1565c0;
- --paper-blue-900: #0d47a1;
- --paper-blue-a100: #82b1ff;
- --paper-blue-a200: #448aff;
- --paper-blue-a400: #2979ff;
- --paper-blue-a700: #2962ff;
-
--paper-light-blue-50: #e1f5fe;
--paper-light-blue-100: #b3e5fc;
--paper-light-blue-200: #81d4fa;
@@ -171,81 +96,6 @@ const template = html`
--paper-light-blue-a400: #00b0ff;
--paper-light-blue-a700: #0091ea;
- --paper-cyan-50: #e0f7fa;
- --paper-cyan-100: #b2ebf2;
- --paper-cyan-200: #80deea;
- --paper-cyan-300: #4dd0e1;
- --paper-cyan-400: #26c6da;
- --paper-cyan-500: #00bcd4;
- --paper-cyan-600: #00acc1;
- --paper-cyan-700: #0097a7;
- --paper-cyan-800: #00838f;
- --paper-cyan-900: #006064;
- --paper-cyan-a100: #84ffff;
- --paper-cyan-a200: #18ffff;
- --paper-cyan-a400: #00e5ff;
- --paper-cyan-a700: #00b8d4;
-
- --paper-teal-50: #e0f2f1;
- --paper-teal-100: #b2dfdb;
- --paper-teal-200: #80cbc4;
- --paper-teal-300: #4db6ac;
- --paper-teal-400: #26a69a;
- --paper-teal-500: #009688;
- --paper-teal-600: #00897b;
- --paper-teal-700: #00796b;
- --paper-teal-800: #00695c;
- --paper-teal-900: #004d40;
- --paper-teal-a100: #a7ffeb;
- --paper-teal-a200: #64ffda;
- --paper-teal-a400: #1de9b6;
- --paper-teal-a700: #00bfa5;
-
- --paper-green-50: #e8f5e9;
- --paper-green-100: #c8e6c9;
- --paper-green-200: #a5d6a7;
- --paper-green-300: #81c784;
- --paper-green-400: #66bb6a;
- --paper-green-500: #4caf50;
- --paper-green-600: #43a047;
- --paper-green-700: #388e3c;
- --paper-green-800: #2e7d32;
- --paper-green-900: #1b5e20;
- --paper-green-a100: #b9f6ca;
- --paper-green-a200: #69f0ae;
- --paper-green-a400: #00e676;
- --paper-green-a700: #00c853;
-
- --paper-light-green-50: #f1f8e9;
- --paper-light-green-100: #dcedc8;
- --paper-light-green-200: #c5e1a5;
- --paper-light-green-300: #aed581;
- --paper-light-green-400: #9ccc65;
- --paper-light-green-500: #8bc34a;
- --paper-light-green-600: #7cb342;
- --paper-light-green-700: #689f38;
- --paper-light-green-800: #558b2f;
- --paper-light-green-900: #33691e;
- --paper-light-green-a100: #ccff90;
- --paper-light-green-a200: #b2ff59;
- --paper-light-green-a400: #76ff03;
- --paper-light-green-a700: #64dd17;
-
- --paper-lime-50: #f9fbe7;
- --paper-lime-100: #f0f4c3;
- --paper-lime-200: #e6ee9c;
- --paper-lime-300: #dce775;
- --paper-lime-400: #d4e157;
- --paper-lime-500: #cddc39;
- --paper-lime-600: #c0ca33;
- --paper-lime-700: #afb42b;
- --paper-lime-800: #9e9d24;
- --paper-lime-900: #827717;
- --paper-lime-a100: #f4ff81;
- --paper-lime-a200: #eeff41;
- --paper-lime-a400: #c6ff00;
- --paper-lime-a700: #aeea00;
-
--paper-yellow-50: #fffde7;
--paper-yellow-100: #fff9c4;
--paper-yellow-200: #fff59d;
@@ -261,21 +111,6 @@ const template = html`
--paper-yellow-a400: #ffea00;
--paper-yellow-a700: #ffd600;
- --paper-amber-50: #fff8e1;
- --paper-amber-100: #ffecb3;
- --paper-amber-200: #ffe082;
- --paper-amber-300: #ffd54f;
- --paper-amber-400: #ffca28;
- --paper-amber-500: #ffc107;
- --paper-amber-600: #ffb300;
- --paper-amber-700: #ffa000;
- --paper-amber-800: #ff8f00;
- --paper-amber-900: #ff6f00;
- --paper-amber-a100: #ffe57f;
- --paper-amber-a200: #ffd740;
- --paper-amber-a400: #ffc400;
- --paper-amber-a700: #ffab00;
-
--paper-orange-50: #fff3e0;
--paper-orange-100: #ffe0b2;
--paper-orange-200: #ffcc80;
@@ -291,32 +126,6 @@ const template = html`
--paper-orange-a400: #ff9100;
--paper-orange-a700: #ff6500;
- --paper-deep-orange-50: #fbe9e7;
- --paper-deep-orange-100: #ffccbc;
- --paper-deep-orange-200: #ffab91;
- --paper-deep-orange-300: #ff8a65;
- --paper-deep-orange-400: #ff7043;
- --paper-deep-orange-500: #ff5722;
- --paper-deep-orange-600: #f4511e;
- --paper-deep-orange-700: #e64a19;
- --paper-deep-orange-800: #d84315;
- --paper-deep-orange-900: #bf360c;
- --paper-deep-orange-a100: #ff9e80;
- --paper-deep-orange-a200: #ff6e40;
- --paper-deep-orange-a400: #ff3d00;
- --paper-deep-orange-a700: #dd2c00;
-
- --paper-brown-50: #efebe9;
- --paper-brown-100: #d7ccc8;
- --paper-brown-200: #bcaaa4;
- --paper-brown-300: #a1887f;
- --paper-brown-400: #8d6e63;
- --paper-brown-500: #795548;
- --paper-brown-600: #6d4c41;
- --paper-brown-700: #5d4037;
- --paper-brown-800: #4e342e;
- --paper-brown-900: #3e2723;
-
--paper-grey-50: #fafafa;
--paper-grey-100: #f5f5f5;
--paper-grey-200: #eeeeee;