Commit 23591c48 authored by Eric Bidelman's avatar Eric Bidelman

Polymer cleanup

parent a500cab9
node_modules
bower_components/iron-localstorage/.bower.json bower_components/iron-localstorage/.bower.json
bower_components/iron-localstorage/.gitignore bower_components/iron-localstorage/.gitignore
bower_components/iron-localstorage/README.md bower_components/iron-localstorage/README.md
...@@ -19,7 +21,7 @@ bower_components/flatiron-director ...@@ -19,7 +21,7 @@ bower_components/flatiron-director
!bower_components/flatiron-director/flatiron-director.html !bower_components/flatiron-director/flatiron-director.html
bower_components/webcomponentsjs bower_components/webcomponentsjs
!bower_components/webcomponentsjs/webcomponents.js !bower_components/webcomponentsjs/webcomponents-lite.min.js
bower_components/polymer/.bower.json bower_components/polymer/.bower.json
bower_components/polymer/LICENSE.txt bower_components/polymer/LICENSE.txt
......
{ {
"name": "todomvc-polymer", "name": "todomvc-polymer",
"version": "0.0.1", "version": "0.0.2",
"dependencies": { "dependencies": {
"todomvc-common": "^1.0.1", "todomvc-common": "^1.0.1",
"todomvc-app-css": "^1.0.0", "todomvc-app-css": "^1.0.0",
"polymer": "Polymer/polymer#1.1.0", "polymer": "Polymer/polymer#^1.1.4",
"iron-selector": "polymerelements/iron-selector", "iron-selector": "PolymerElements/iron-selector#^1.0.5",
"flatiron-director": "PolymerLabs/flatiron-director#1.0.0", "flatiron-director": "PolymerLabs/flatiron-director#^1.0.0",
"iron-localstorage": "polymerelements/iron-localstorage" "iron-localstorage": "PolymerElements/iron-localstorage#^1.0.4"
} }
} }
...@@ -103,9 +103,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN ...@@ -103,9 +103,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
var i = this.selectedValues.indexOf(value); var i = this.selectedValues.indexOf(value);
var unselected = i < 0; var unselected = i < 0;
if (unselected) { if (unselected) {
this.selectedValues.push(value); this.push('selectedValues',value);
} else { } else {
this.selectedValues.splice(i, 1); this.splice('selectedValues',i,1);
} }
this._selection.setItemSelected(this._valueToItem(value), unselected); this._selection.setItemSelected(this._valueToItem(value), unselected);
} }
......
...@@ -15,14 +15,39 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN ...@@ -15,14 +15,39 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
/** @polymerBehavior */ /** @polymerBehavior */
Polymer.IronSelectableBehavior = { Polymer.IronSelectableBehavior = {
/**
* Fired when iron-selector is activated (selected or deselected).
* It is fired before the selected items are changed.
* Cancel the event to abort selection.
*
* @event iron-activate
*/
/**
* Fired when an item is selected
*
* @event iron-select
*/
/**
* Fired when an item is deselected
*
* @event iron-deselect
*/
/**
* Fired when the list of selectable items changes (e.g., items are
* added or removed). The detail of the event is a list of mutation
* records that describe what changed.
*
* @event iron-items-changed
*/
properties: { properties: {
/** /**
* If you want to use the attribute value of an element for `selected` instead of the index, * If you want to use the attribute value of an element for `selected` instead of the index,
* set this to the name of the attribute. * set this to the name of the attribute.
*
* @attribute attrForSelected
* @type {string}
*/ */
attrForSelected: { attrForSelected: {
type: String, type: String,
...@@ -31,9 +56,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN ...@@ -31,9 +56,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
/** /**
* Gets or sets the selected element. The default is to use the index of the item. * Gets or sets the selected element. The default is to use the index of the item.
*
* @attribute selected
* @type {string}
*/ */
selected: { selected: {
type: String, type: String,
...@@ -42,9 +64,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN ...@@ -42,9 +64,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
/** /**
* Returns the currently selected item. * Returns the currently selected item.
*
* @attribute selectedItem
* @type {Object}
*/ */
selectedItem: { selectedItem: {
type: Object, type: Object,
...@@ -56,10 +75,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN ...@@ -56,10 +75,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
* The event that fires from items when they are selected. Selectable * The event that fires from items when they are selected. Selectable
* will listen for this event from items and update the selection state. * will listen for this event from items and update the selection state.
* Set to empty string to listen to no events. * Set to empty string to listen to no events.
*
* @attribute activateEvent
* @type {string}
* @default 'tap'
*/ */
activateEvent: { activateEvent: {
type: String, type: String,
...@@ -68,19 +83,13 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN ...@@ -68,19 +83,13 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
}, },
/** /**
* This is a CSS selector sting. If this is set, only items that matches the CSS selector * This is a CSS selector string. If this is set, only items that match the CSS selector
* are selectable. * are selectable.
*
* @attribute selectable
* @type {string}
*/ */
selectable: String, selectable: String,
/** /**
* The class to set on elements when selected. * The class to set on elements when selected.
*
* @attribute selectedClass
* @type {string}
*/ */
selectedClass: { selectedClass: {
type: String, type: String,
...@@ -89,25 +98,33 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN ...@@ -89,25 +98,33 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
/** /**
* The attribute to set on elements when selected. * The attribute to set on elements when selected.
*
* @attribute selectedAttribute
* @type {string}
*/ */
selectedAttribute: { selectedAttribute: {
type: String, type: String,
value: null value: null
} },
/**
* The set of excluded elements where the key is the `localName`
* of the element that will be ignored from the item list.
*
* @type {object}
* @default {template: 1}
*/
excludedLocalNames: {
type: Object,
value: function() {
return {
'template': 1
};
}
}
}, },
observers: [ observers: [
'_updateSelected(attrForSelected, selected)' '_updateSelected(attrForSelected, selected)'
], ],
excludedLocalNames: {
'template': 1
},
created: function() { created: function() {
this._bindFilterItem = this._filterItem.bind(this); this._bindFilterItem = this._filterItem.bind(this);
this._selection = new Polymer.IronSelection(this._applySelection.bind(this)); this._selection = new Polymer.IronSelection(this._applySelection.bind(this));
...@@ -116,6 +133,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN ...@@ -116,6 +133,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
attached: function() { attached: function() {
this._observer = this._observeItems(this); this._observer = this._observeItems(this);
this._contentObserver = this._observeContent(this); this._contentObserver = this._observeContent(this);
if (!this.selectedItem && this.selected) {
this._updateSelected(this.attrForSelected,this.selected)
}
}, },
detached: function() { detached: function() {
...@@ -186,9 +206,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN ...@@ -186,9 +206,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
}, },
_removeListener: function(eventName) { _removeListener: function(eventName) {
// There is no unlisten yet... this.unlisten(this, eventName, '_activateHandler');
// https://github.com/Polymer/polymer/issues/1639
//this.removeEventListener(eventName, this._bindActivateHandler);
}, },
_activateEventChanged: function(eventName, old) { _activateEventChanged: function(eventName, old) {
...@@ -264,7 +282,15 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN ...@@ -264,7 +282,15 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
// observe items change under the given node. // observe items change under the given node.
_observeItems: function(node) { _observeItems: function(node) {
var observer = new MutationObserver(function() { // TODO(cdata): Update this when we get distributed children changed.
var observer = new MutationObserver(function(mutations) {
// Let other interested parties know about the change so that
// we don't have to recreate mutation observers everywher.
this.fire('iron-items-changed', mutations, {
bubbles: false,
cancelable: false
});
if (this.selected != null) { if (this.selected != null) {
this._updateSelected(); this._updateSelected();
} }
...@@ -277,11 +303,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN ...@@ -277,11 +303,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
}, },
_activateHandler: function(e) { _activateHandler: function(e) {
// TODO: remove this when https://github.com/Polymer/polymer/issues/1639 is fixed so we
// can just remove the old event listener.
if (e.type !== this.activateEvent) {
return;
}
var t = e.target; var t = e.target;
var items = this.items; var items = this.items;
while (t && t != this) { while (t && t != this) {
......
...@@ -32,7 +32,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN ...@@ -32,7 +32,7 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
* the selected item or undefined if there is no selection. * the selected item or undefined if there is no selection.
*/ */
get: function() { get: function() {
return this.multi ? this.selection : this.selection[0]; return this.multi ? this.selection.slice() : this.selection[0];
}, },
/** /**
......
...@@ -20,7 +20,7 @@ addEventListener('DOMContentLoaded', resolve); ...@@ -20,7 +20,7 @@ addEventListener('DOMContentLoaded', resolve);
} }
} }
}()); }());
Polymer = { window.Polymer = {
Settings: function () { Settings: function () {
var user = window.Polymer || {}; var user = window.Polymer || {};
location.search.slice(1).split('&').forEach(function (o) { location.search.slice(1).split('&').forEach(function (o) {
...@@ -48,15 +48,21 @@ useNativeCustomElements: useNativeCustomElements ...@@ -48,15 +48,21 @@ useNativeCustomElements: useNativeCustomElements
(function () { (function () {
var userPolymer = window.Polymer; var userPolymer = window.Polymer;
window.Polymer = function (prototype) { window.Polymer = function (prototype) {
var ctor = desugar(prototype); if (typeof prototype === 'function') {
prototype = ctor.prototype; prototype = prototype.prototype;
}
if (!prototype) {
prototype = {};
}
var factory = desugar(prototype);
prototype = factory.prototype;
var options = { prototype: prototype }; var options = { prototype: prototype };
if (prototype.extends) { if (prototype.extends) {
options.extends = prototype.extends; options.extends = prototype.extends;
} }
Polymer.telemetry._registrate(prototype); Polymer.telemetry._registrate(prototype);
document.registerElement(prototype.is, options); document.registerElement(prototype.is, options);
return ctor; return factory;
}; };
var desugar = function (prototype) { var desugar = function (prototype) {
var base = Polymer.Base; var base = Polymer.Base;
...@@ -133,6 +139,8 @@ _addFeature: function (feature) { ...@@ -133,6 +139,8 @@ _addFeature: function (feature) {
this.extend(this, feature); this.extend(this, feature);
}, },
registerCallback: function () { registerCallback: function () {
this._desugarBehaviors();
this._doBehavior('beforeRegister');
this._registerFeatures(); this._registerFeatures();
this._doBehavior('registered'); this._doBehavior('registered');
}, },
...@@ -217,6 +225,9 @@ Polymer.telemetry.instanceCount = 0; ...@@ -217,6 +225,9 @@ Polymer.telemetry.instanceCount = 0;
(function () { (function () {
var modules = {}; var modules = {};
var lcModules = {}; var lcModules = {};
var findModule = function (id) {
return modules[id] || lcModules[id.toLowerCase()];
};
var DomModule = function () { var DomModule = function () {
return document.createElement('dom-module'); return document.createElement('dom-module');
}; };
...@@ -235,16 +246,18 @@ lcModules[id.toLowerCase()] = this; ...@@ -235,16 +246,18 @@ lcModules[id.toLowerCase()] = this;
} }
}, },
import: function (id, selector) { import: function (id, selector) {
var m = modules[id] || lcModules[id.toLowerCase()]; if (id) {
var m = findModule(id);
if (!m) { if (!m) {
forceDocumentUpgrade(); forceDocumentUpgrade();
m = modules[id]; m = findModule(id);
} }
if (m && selector) { if (m && selector) {
m = m.querySelector(selector); m = m.querySelector(selector);
} }
return m; return m;
} }
}
}); });
var cePolyfill = window.CustomElements && !CustomElements.useNative; var cePolyfill = window.CustomElements && !CustomElements.useNative;
document.registerElement('dom-module', DomModule); document.registerElement('dom-module', DomModule);
...@@ -252,8 +265,7 @@ function forceDocumentUpgrade() { ...@@ -252,8 +265,7 @@ function forceDocumentUpgrade() {
if (cePolyfill) { if (cePolyfill) {
var script = document._currentScript || document.currentScript; var script = document._currentScript || document.currentScript;
var doc = script && script.ownerDocument; var doc = script && script.ownerDocument;
if (doc && !doc.__customElementsForceUpgraded) { if (doc) {
doc.__customElementsForceUpgraded = true;
CustomElements.upgradeAll(doc); CustomElements.upgradeAll(doc);
} }
} }
...@@ -275,11 +287,17 @@ this.is = this.is.toLowerCase(); ...@@ -275,11 +287,17 @@ this.is = this.is.toLowerCase();
}); });
Polymer.Base._addFeature({ Polymer.Base._addFeature({
behaviors: [], behaviors: [],
_prepBehaviors: function () { _desugarBehaviors: function () {
if (this.behaviors.length) { if (this.behaviors.length) {
this.behaviors = this._flattenBehaviorsList(this.behaviors); this.behaviors = this._desugarSomeBehaviors(this.behaviors);
} }
this._prepAllBehaviors(this.behaviors); },
_desugarSomeBehaviors: function (behaviors) {
behaviors = this._flattenBehaviorsList(behaviors);
for (var i = behaviors.length - 1; i >= 0; i--) {
this._mixinBehavior(behaviors[i]);
}
return behaviors;
}, },
_flattenBehaviorsList: function (behaviors) { _flattenBehaviorsList: function (behaviors) {
var flat = []; var flat = [];
...@@ -294,15 +312,6 @@ this._warn(this._logf('_flattenBehaviorsList', 'behavior is null, check for miss ...@@ -294,15 +312,6 @@ this._warn(this._logf('_flattenBehaviorsList', 'behavior is null, check for miss
}, this); }, this);
return flat; return flat;
}, },
_prepAllBehaviors: function (behaviors) {
for (var i = behaviors.length - 1; i >= 0; i--) {
this._mixinBehavior(behaviors[i]);
}
for (var i = 0, l = behaviors.length; i < l; i++) {
this._prepBehavior(behaviors[i]);
}
this._prepBehavior(this);
},
_mixinBehavior: function (b) { _mixinBehavior: function (b) {
Object.getOwnPropertyNames(b).forEach(function (n) { Object.getOwnPropertyNames(b).forEach(function (n) {
switch (n) { switch (n) {
...@@ -326,6 +335,15 @@ break; ...@@ -326,6 +335,15 @@ break;
} }
}, this); }, this);
}, },
_prepBehaviors: function () {
this._prepFlattenedBehaviors(this.behaviors);
},
_prepFlattenedBehaviors: function (behaviors) {
for (var i = 0, l = behaviors.length; i < l; i++) {
this._prepBehavior(behaviors[i]);
}
this._prepBehavior(this);
},
_doBehavior: function (name, args) { _doBehavior: function (name, args) {
this.behaviors.forEach(function (b) { this.behaviors.forEach(function (b) {
this._invokeBehavior(b, name, args); this._invokeBehavior(b, name, args);
...@@ -558,7 +576,7 @@ debouncer.stop(); ...@@ -558,7 +576,7 @@ debouncer.stop();
} }
} }
}); });
Polymer.version = '1.1.0'; Polymer.version = '1.1.4';
Polymer.Base._addFeature({ Polymer.Base._addFeature({
_registerFeatures: function () { _registerFeatures: function () {
this._prepIs(); this._prepIs();
......
...@@ -457,47 +457,43 @@ Polymer.dom.addDebouncer(host.debounce('_distribute', host._distributeContent)); ...@@ -457,47 +457,43 @@ Polymer.dom.addDebouncer(host.debounce('_distribute', host._distributeContent));
} }
}, },
appendChild: function (node) { appendChild: function (node) {
var handled; return this._addNode(node);
this._ensureContentLogicalInfo(node);
this._removeNodeFromHost(node, true);
if (this._nodeIsInLogicalTree(this.node)) {
this._addLogicalInfo(node, this.node);
this._addNodeToHost(node);
handled = this._maybeDistribute(node, this.node);
} else {
this._addNodeToHost(node);
}
if (!handled && !this._tryRemoveUndistributedNode(node)) {
var container = this.node._isShadyRoot ? this.node.host : this.node;
addToComposedParent(container, node);
nativeAppendChild.call(container, node);
}
return node;
}, },
insertBefore: function (node, ref_node) { insertBefore: function (node, ref_node) {
if (!ref_node) { return this._addNode(node, ref_node);
return this.appendChild(node); },
} _addNode: function (node, ref_node) {
var handled;
this._ensureContentLogicalInfo(node);
this._removeNodeFromHost(node, true); this._removeNodeFromHost(node, true);
if (this._nodeIsInLogicalTree(this.node)) { var addedInsertionPoint;
var root = this.getOwnerRoot();
if (root) {
addedInsertionPoint = this._maybeAddInsertionPoint(node, this.node);
}
if (this._nodeHasLogicalChildren(this.node)) {
if (ref_node) {
var children = this.childNodes; var children = this.childNodes;
var index = children.indexOf(ref_node); var index = children.indexOf(ref_node);
if (index < 0) { if (index < 0) {
throw Error('The ref_node to be inserted before is not a child ' + 'of this node'); throw Error('The ref_node to be inserted before is not a child ' + 'of this node');
} }
}
this._addLogicalInfo(node, this.node, index); this._addLogicalInfo(node, this.node, index);
this._addNodeToHost(node);
handled = this._maybeDistribute(node, this.node);
} else {
this._addNodeToHost(node);
} }
if (!handled && !this._tryRemoveUndistributedNode(node)) { this._addNodeToHost(node);
if (!this._maybeDistribute(node, this.node) && !this._tryRemoveUndistributedNode(node)) {
if (ref_node) {
ref_node = ref_node.localName === CONTENT ? this._firstComposedNode(ref_node) : ref_node; ref_node = ref_node.localName === CONTENT ? this._firstComposedNode(ref_node) : ref_node;
}
var container = this.node._isShadyRoot ? this.node.host : this.node; var container = this.node._isShadyRoot ? this.node.host : this.node;
addToComposedParent(container, node, ref_node); addToComposedParent(container, node, ref_node);
if (ref_node) {
nativeInsertBefore.call(container, node, ref_node); nativeInsertBefore.call(container, node, ref_node);
} else {
nativeAppendChild.call(container, node);
}
}
if (addedInsertionPoint) {
this._updateInsertionPoints(root.host);
} }
return node; return node;
}, },
...@@ -505,14 +501,8 @@ removeChild: function (node) { ...@@ -505,14 +501,8 @@ removeChild: function (node) {
if (factory(node).parentNode !== this.node) { if (factory(node).parentNode !== this.node) {
console.warn('The node to be removed is not a child of this node', node); console.warn('The node to be removed is not a child of this node', node);
} }
var handled;
if (this._nodeIsInLogicalTree(this.node)) {
this._removeNodeFromHost(node); this._removeNodeFromHost(node);
handled = this._maybeDistribute(node, this.node); if (!this._maybeDistribute(node, this.node)) {
} else {
this._removeNodeFromHost(node);
}
if (!handled) {
var container = this.node._isShadyRoot ? this.node.host : this.node; var container = this.node._isShadyRoot ? this.node.host : this.node;
if (container === node.parentNode) { if (container === node.parentNode) {
removeFromComposedParent(container, node); removeFromComposedParent(container, node);
...@@ -560,7 +550,6 @@ if (hasContent) { ...@@ -560,7 +550,6 @@ if (hasContent) {
var root = this._ownerShadyRootForNode(parent); var root = this._ownerShadyRootForNode(parent);
if (root) { if (root) {
var host = root.host; var host = root.host;
this._updateInsertionPoints(host);
this._lazyDistribute(host); this._lazyDistribute(host);
} }
} }
...@@ -570,10 +559,30 @@ this._lazyDistribute(parent); ...@@ -570,10 +559,30 @@ this._lazyDistribute(parent);
} }
return parentNeedsDist || hasContent && !wrappedContent; return parentNeedsDist || hasContent && !wrappedContent;
}, },
_maybeAddInsertionPoint: function (node, parent) {
var added;
if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE && !node.__noContent) {
var c$ = factory(node).querySelectorAll(CONTENT);
for (var i = 0, n, np, na; i < c$.length && (n = c$[i]); i++) {
np = factory(n).parentNode;
if (np === node) {
np = parent;
}
na = this._maybeAddInsertionPoint(n, np);
added = added || na;
}
} else if (node.localName === CONTENT) {
saveLightChildrenIfNeeded(parent);
saveLightChildrenIfNeeded(node);
added = true;
}
return added;
},
_tryRemoveUndistributedNode: function (node) { _tryRemoveUndistributedNode: function (node) {
if (this.node.shadyRoot) { if (this.node.shadyRoot) {
if (node._composedParent) { var parent = getComposedParent(node);
nativeRemoveChild.call(node._composedParent, node); if (parent) {
nativeRemoveChild.call(parent, node);
} }
return true; return true;
} }
...@@ -586,20 +595,8 @@ saveLightChildrenIfNeeded(c); ...@@ -586,20 +595,8 @@ saveLightChildrenIfNeeded(c);
saveLightChildrenIfNeeded(factory(c).parentNode); saveLightChildrenIfNeeded(factory(c).parentNode);
} }
}, },
_nodeIsInLogicalTree: function (node) { _nodeHasLogicalChildren: function (node) {
return Boolean(node._lightParent !== undefined || node._isShadyRoot || node.shadyRoot); return Boolean(node._lightChildren !== undefined);
},
_ensureContentLogicalInfo: function (node) {
if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
saveLightChildrenIfNeeded(this.node);
var c$ = Array.prototype.slice.call(node.childNodes);
for (var i = 0, n; i < c$.length && (n = c$[i]); i++) {
this._ensureContentLogicalInfo(n);
}
} else if (node.localName === CONTENT) {
saveLightChildrenIfNeeded(this.node);
saveLightChildrenIfNeeded(node);
}
}, },
_parentNeedsDistribution: function (parent) { _parentNeedsDistribution: function (parent) {
return parent && parent.shadyRoot && hasInsertionPoint(parent.shadyRoot); return parent && parent.shadyRoot && hasInsertionPoint(parent.shadyRoot);
...@@ -609,6 +606,7 @@ var hostNeedsDist; ...@@ -609,6 +606,7 @@ var hostNeedsDist;
var root; var root;
var parent = node._lightParent; var parent = node._lightParent;
if (parent) { if (parent) {
factory(node)._distributeParent();
root = this._ownerShadyRootForNode(node); root = this._ownerShadyRootForNode(node);
if (root) { if (root) {
root.host._elementRemove(node); root.host._elementRemove(node);
...@@ -621,7 +619,7 @@ if (root && hostNeedsDist) { ...@@ -621,7 +619,7 @@ if (root && hostNeedsDist) {
this._updateInsertionPoints(root.host); this._updateInsertionPoints(root.host);
this._lazyDistribute(root.host); this._lazyDistribute(root.host);
} else if (ensureComposedRemoval) { } else if (ensureComposedRemoval) {
removeFromComposedParent(parent || node.parentNode, node); removeFromComposedParent(getComposedParent(node), node);
} }
}, },
_removeDistributedChildren: function (root, container) { _removeDistributedChildren: function (root, container) {
...@@ -845,7 +843,7 @@ configurable: true ...@@ -845,7 +843,7 @@ configurable: true
}, },
parentNode: { parentNode: {
get: function () { get: function () {
return this.node._lightParent || (this.node.__patched ? this.node._composedParent : this.node.parentNode); return this.node._lightParent || getComposedParent(this.node);
}, },
configurable: true configurable: true
}, },
...@@ -967,6 +965,18 @@ DomApi.prototype._getComposedInnerHTML = function () { ...@@ -967,6 +965,18 @@ DomApi.prototype._getComposedInnerHTML = function () {
return getInnerHTML(this.node, true); return getInnerHTML(this.node, true);
}; };
} else { } else {
var forwardMethods = [
'cloneNode',
'appendChild',
'insertBefore',
'removeChild',
'replaceChild'
];
forwardMethods.forEach(function (name) {
DomApi.prototype[name] = function () {
return this.node[name].apply(this.node, arguments);
};
});
DomApi.prototype.querySelectorAll = function (selector) { DomApi.prototype.querySelectorAll = function (selector) {
return Array.prototype.slice.call(this.node.querySelectorAll(selector)); return Array.prototype.slice.call(this.node.querySelectorAll(selector));
}; };
...@@ -979,9 +989,6 @@ return n; ...@@ -979,9 +989,6 @@ return n;
n = n.parentNode; n = n.parentNode;
} }
}; };
DomApi.prototype.cloneNode = function (deep) {
return this.node.cloneNode(deep);
};
DomApi.prototype.importNode = function (externalNode, deep) { DomApi.prototype.importNode = function (externalNode, deep) {
var doc = this.node instanceof Document ? this.node : this.node.ownerDocument; var doc = this.node instanceof Document ? this.node : this.node.ownerDocument;
return doc.importNode(externalNode, deep); return doc.importNode(externalNode, deep);
...@@ -1028,7 +1035,7 @@ return this.node.innerHTML = value; ...@@ -1028,7 +1035,7 @@ return this.node.innerHTML = value;
configurable: true configurable: true
} }
}); });
var forwards = [ var forwardProperties = [
'parentNode', 'parentNode',
'firstChild', 'firstChild',
'lastChild', 'lastChild',
...@@ -1039,7 +1046,7 @@ var forwards = [ ...@@ -1039,7 +1046,7 @@ var forwards = [
'nextElementSibling', 'nextElementSibling',
'previousElementSibling' 'previousElementSibling'
]; ];
forwards.forEach(function (name) { forwardProperties.forEach(function (name) {
Object.defineProperty(DomApi.prototype, name, { Object.defineProperty(DomApi.prototype, name, {
get: function () { get: function () {
return this.node[name]; return this.node[name];
...@@ -1123,6 +1130,9 @@ node._composedChildren = null; ...@@ -1123,6 +1130,9 @@ node._composedChildren = null;
addNodeToComposedChildren(node, parent, children, i); addNodeToComposedChildren(node, parent, children, i);
} }
} }
function getComposedParent(node) {
return node.__patched ? node._composedParent : node.parentNode;
}
function addNodeToComposedChildren(node, parent, children, i) { function addNodeToComposedChildren(node, parent, children, i) {
node._composedParent = parent; node._composedParent = parent;
children.splice(i >= 0 ? i : children.length, 0, node); children.splice(i >= 0 ? i : children.length, 0, node);
...@@ -1147,12 +1157,13 @@ node._lightChildren = c$; ...@@ -1147,12 +1157,13 @@ node._lightChildren = c$;
} }
} }
function hasInsertionPoint(root) { function hasInsertionPoint(root) {
return Boolean(root._insertionPoints.length); return Boolean(root && root._insertionPoints.length);
} }
var p = Element.prototype; var p = Element.prototype;
var matchesSelector = p.matches || p.matchesSelector || p.mozMatchesSelector || p.msMatchesSelector || p.oMatchesSelector || p.webkitMatchesSelector; var matchesSelector = p.matches || p.matchesSelector || p.mozMatchesSelector || p.msMatchesSelector || p.oMatchesSelector || p.webkitMatchesSelector;
return { return {
getLightChildren: getLightChildren, getLightChildren: getLightChildren,
getComposedParent: getComposedParent,
getComposedChildren: getComposedChildren, getComposedChildren: getComposedChildren,
removeFromComposedParent: removeFromComposedParent, removeFromComposedParent: removeFromComposedParent,
saveLightChildrenIfNeeded: saveLightChildrenIfNeeded, saveLightChildrenIfNeeded: saveLightChildrenIfNeeded,
...@@ -1341,7 +1352,9 @@ var composed = getComposedChildren(container); ...@@ -1341,7 +1352,9 @@ var composed = getComposedChildren(container);
var splices = Polymer.ArraySplice.calculateSplices(children, composed); var splices = Polymer.ArraySplice.calculateSplices(children, composed);
for (var i = 0, d = 0, s; i < splices.length && (s = splices[i]); i++) { for (var i = 0, d = 0, s; i < splices.length && (s = splices[i]); i++) {
for (var j = 0, n; j < s.removed.length && (n = s.removed[j]); j++) { for (var j = 0, n; j < s.removed.length && (n = s.removed[j]); j++) {
if (getComposedParent(n) === container) {
remove(n); remove(n);
}
composed.splice(s.index + d, 1); composed.splice(s.index + d, 1);
} }
d -= s.addedCount; d -= s.addedCount;
...@@ -1354,6 +1367,7 @@ insertBefore(container, n, next); ...@@ -1354,6 +1367,7 @@ insertBefore(container, n, next);
composed.splice(j, 0, n); composed.splice(j, 0, n);
} }
} }
ensureComposedParent(container, children);
}, },
_matchesContentSelect: function (node, contentElement) { _matchesContentSelect: function (node, contentElement) {
var select = contentElement.getAttribute('select'); var select = contentElement.getAttribute('select');
...@@ -1383,6 +1397,7 @@ var getLightChildren = Polymer.DomApi.getLightChildren; ...@@ -1383,6 +1397,7 @@ var getLightChildren = Polymer.DomApi.getLightChildren;
var matchesSelector = Polymer.DomApi.matchesSelector; var matchesSelector = Polymer.DomApi.matchesSelector;
var hasInsertionPoint = Polymer.DomApi.hasInsertionPoint; var hasInsertionPoint = Polymer.DomApi.hasInsertionPoint;
var getComposedChildren = Polymer.DomApi.getComposedChildren; var getComposedChildren = Polymer.DomApi.getComposedChildren;
var getComposedParent = Polymer.DomApi.getComposedParent;
var removeFromComposedParent = Polymer.DomApi.removeFromComposedParent; var removeFromComposedParent = Polymer.DomApi.removeFromComposedParent;
function distributeNodeInto(child, insertionPoint) { function distributeNodeInto(child, insertionPoint) {
insertionPoint._distributedNodes.push(child); insertionPoint._distributedNodes.push(child);
...@@ -1436,8 +1451,10 @@ node._composedParent = null; ...@@ -1436,8 +1451,10 @@ node._composedParent = null;
nativeRemoveChild.call(parentNode, node); nativeRemoveChild.call(parentNode, node);
} }
} }
function getComposedParent(node) { function ensureComposedParent(parent, children) {
return node.__patched ? node._composedParent : node.parentNode; for (var i = 0, n; i < children.length; i++) {
children[i]._composedParent = parent;
}
} }
function getTopDistributingHost(host) { function getTopDistributingHost(host) {
while (host && hostNeedsRedistribution(host)) { while (host && hostNeedsRedistribution(host)) {
......
...@@ -236,7 +236,11 @@ if (!this._template) { ...@@ -236,7 +236,11 @@ if (!this._template) {
this._notes = []; this._notes = [];
} else { } else {
Polymer.Annotations.prepElement = this._prepElement.bind(this); Polymer.Annotations.prepElement = this._prepElement.bind(this);
if (this._template._content && this._template._content._notes) {
this._notes = this._template._content._notes;
} else {
this._notes = Polymer.Annotations.parseAnnotations(this._template); this._notes = Polymer.Annotations.parseAnnotations(this._template);
}
this._processAnnotations(this._notes); this._processAnnotations(this._notes);
Polymer.Annotations.prepElement = null; Polymer.Annotations.prepElement = null;
} }
...@@ -683,12 +687,12 @@ gd = gobj[dep]; ...@@ -683,12 +687,12 @@ gd = gobj[dep];
if (gd && gd[name]) { if (gd && gd[name]) {
gd[name] = (gd[name] || 1) - 1; gd[name] = (gd[name] || 1) - 1;
gd._count = (gd._count || 1) - 1; gd._count = (gd._count || 1) - 1;
}
if (gd._count === 0) { if (gd._count === 0) {
node.removeEventListener(dep, this.handleNative); node.removeEventListener(dep, this.handleNative);
} }
} }
} }
}
node.removeEventListener(evType, handler); node.removeEventListener(evType, handler);
}, },
register: function (recog) { register: function (recog) {
...@@ -1656,6 +1660,9 @@ name: arg, ...@@ -1656,6 +1660,9 @@ name: arg,
model: this._modelForPath(arg) model: this._modelForPath(arg)
}; };
var fc = arg[0]; var fc = arg[0];
if (fc === '-') {
fc = arg[1];
}
if (fc >= '0' && fc <= '9') { if (fc >= '0' && fc <= '9') {
fc = '#'; fc = '#';
} }
...@@ -1810,6 +1817,7 @@ var h$ = this._handlers; ...@@ -1810,6 +1817,7 @@ var h$ = this._handlers;
for (var i = 0, l = h$.length, h; i < l && (h = h$[i]); i++) { for (var i = 0, l = h$.length, h; i < l && (h = h$[i]); i++) {
h[0].call(this, h[1], h[2]); h[0].call(this, h[1], h[2]);
} }
this._handlers = [];
} }
}); });
(function () { (function () {
...@@ -1933,7 +1941,7 @@ this._boundPaths = this._boundPaths || {}; ...@@ -1933,7 +1941,7 @@ this._boundPaths = this._boundPaths || {};
if (from) { if (from) {
this._boundPaths[to] = from; this._boundPaths[to] = from;
} else { } else {
this.unbindPath(to); this.unlinkPaths(to);
} }
}, },
unlinkPaths: function (path) { unlinkPaths: function (path) {
...@@ -1942,23 +1950,13 @@ delete this._boundPaths[path]; ...@@ -1942,23 +1950,13 @@ delete this._boundPaths[path];
} }
}, },
_notifyBoundPaths: function (path, value) { _notifyBoundPaths: function (path, value) {
var from, to;
for (var a in this._boundPaths) { for (var a in this._boundPaths) {
var b = this._boundPaths[a]; var b = this._boundPaths[a];
if (path.indexOf(a + '.') == 0) { if (path.indexOf(a + '.') == 0) {
from = a; this.notifyPath(this._fixPath(b, a, path), value);
to = b; } else if (path.indexOf(b + '.') == 0) {
break; this.notifyPath(this._fixPath(a, b, path), value);
} }
if (path.indexOf(b + '.') == 0) {
from = b;
to = a;
break;
}
}
if (from && to) {
var p = this._fixPath(to, from, path);
this.notifyPath(p, value);
} }
}, },
_fixPath: function (property, root, path) { _fixPath: function (property, root, path) {
...@@ -2186,7 +2184,7 @@ MIXIN_RULE: 1000 ...@@ -2186,7 +2184,7 @@ MIXIN_RULE: 1000
OPEN_BRACE: '{', OPEN_BRACE: '{',
CLOSE_BRACE: '}', CLOSE_BRACE: '}',
_rx: { _rx: {
comments: /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim, comments: /\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,
port: /@import[^;]*;/gim, port: /@import[^;]*;/gim,
customProp: /(?:^|[\s;])--[^;{]*?:[^{};]*?(?:[;\n]|$)/gim, customProp: /(?:^|[\s;])--[^;{]*?:[^{};]*?(?:[;\n]|$)/gim,
mixinProp: /(?:^|[\s;])--[^;{]*?:[^{;]*?{[^}]*?}(?:[;\n]|$)?/gim, mixinProp: /(?:^|[\s;])--[^;{]*?:[^{;]*?{[^}]*?}(?:[;\n]|$)?/gim,
...@@ -2230,6 +2228,9 @@ clearStyleRules: function (style) { ...@@ -2230,6 +2228,9 @@ clearStyleRules: function (style) {
style.__cssRules = null; style.__cssRules = null;
}, },
forEachStyleRule: function (node, callback) { forEachStyleRule: function (node, callback) {
if (!node) {
return;
}
var s = node.parsedSelector; var s = node.parsedSelector;
var skipRules = false; var skipRules = false;
if (node.type === this.ruleTypes.STYLE_RULE) { if (node.type === this.ruleTypes.STYLE_RULE) {
...@@ -2258,47 +2259,44 @@ afterNode = n$[n$.length - 1]; ...@@ -2258,47 +2259,44 @@ afterNode = n$[n$.length - 1];
target.insertBefore(style, afterNode && afterNode.nextSibling || target.firstChild); target.insertBefore(style, afterNode && afterNode.nextSibling || target.firstChild);
return style; return style;
}, },
cssFromModules: function (moduleIds) { cssFromModules: function (moduleIds, warnIfNotFound) {
var modules = moduleIds.trim().split(' '); var modules = moduleIds.trim().split(' ');
var cssText = ''; var cssText = '';
for (var i = 0; i < modules.length; i++) { for (var i = 0; i < modules.length; i++) {
cssText += this.cssFromModule(modules[i]); cssText += this.cssFromModule(modules[i], warnIfNotFound);
} }
return cssText; return cssText;
}, },
cssFromModule: function (moduleId) { cssFromModule: function (moduleId, warnIfNotFound) {
var m = Polymer.DomModule.import(moduleId); var m = Polymer.DomModule.import(moduleId);
if (m && !m._cssText) { if (m && !m._cssText) {
m._cssText = this._cssFromElement(m); m._cssText = this._cssFromElement(m);
} }
if (!m && warnIfNotFound) {
console.warn('Could not find style data in module named', moduleId);
}
return m && m._cssText || ''; return m && m._cssText || '';
}, },
_cssFromElement: function (element) { _cssFromElement: function (element) {
var cssText = ''; var cssText = '';
var content = element.content || element; var content = element.content || element;
var sourceDoc = element.ownerDocument;
var e$ = Array.prototype.slice.call(content.querySelectorAll(this.MODULE_STYLES_SELECTOR)); var e$ = Array.prototype.slice.call(content.querySelectorAll(this.MODULE_STYLES_SELECTOR));
for (var i = 0, e, resolveDoc, addModule; i < e$.length; i++) { for (var i = 0, e; i < e$.length; i++) {
e = e$[i]; e = e$[i];
resolveDoc = sourceDoc;
addModule = null;
if (e.localName === 'template') { if (e.localName === 'template') {
cssText += this._cssFromElement(e); cssText += this._cssFromElement(e);
} else { } else {
if (e.localName === 'style') { if (e.localName === 'style') {
addModule = e.getAttribute(this.INCLUDE_ATTR); var include = e.getAttribute(this.INCLUDE_ATTR);
if (include) {
cssText += this.cssFromModules(include, true);
}
e = e.__appliedElement || e; e = e.__appliedElement || e;
e.parentNode.removeChild(e); e.parentNode.removeChild(e);
} else { cssText += this.resolveCss(e.textContent, element.ownerDocument);
e = e.import && e.import.body; } else if (e.import && e.import.body) {
resolveDoc = e.ownerDocument; cssText += this.resolveCss(e.import.body.textContent, e.import);
} }
if (e) {
cssText += this.resolveCss(e.textContent, resolveDoc);
}
}
if (addModule) {
cssText += this.cssFromModules(addModule);
} }
} }
return cssText; return cssText;
...@@ -3232,18 +3230,25 @@ observer.observe(e, { childList: true }); ...@@ -3232,18 +3230,25 @@ observer.observe(e, { childList: true });
_apply: function () { _apply: function () {
var e = this.__appliedElement || this; var e = this.__appliedElement || this;
if (this.include) { if (this.include) {
e.textContent += styleUtil.cssFromModules(this.include); e.textContent = styleUtil.cssFromModules(this.include, true) + e.textContent;
} }
if (e.textContent) {
styleUtil.forEachStyleRule(styleUtil.rulesForStyle(e), function (rule) {
styleTransformer.documentRule(rule);
});
this._applyCustomProperties(e);
}
},
_applyCustomProperties: function (element) {
this._computeStyleProperties(); this._computeStyleProperties();
var props = this._styleProperties; var props = this._styleProperties;
var self = this; var rules = styleUtil.rulesForStyle(element);
e.textContent = styleUtil.toCssText(styleUtil.rulesForStyle(e), function (rule) { element.textContent = styleUtil.toCssText(rules, function (rule) {
var css = rule.cssText = rule.parsedCssText; var css = rule.cssText = rule.parsedCssText;
if (rule.propertyInfo && rule.propertyInfo.cssText) { if (rule.propertyInfo && rule.propertyInfo.cssText) {
css = cssParse.removeCustomPropAssignment(css); css = cssParse.removeCustomPropAssignment(css);
rule.cssText = propertyUtils.valueForProperties(css, props); rule.cssText = propertyUtils.valueForProperties(css, props);
} }
styleTransformer.documentRule(rule);
}); });
} }
}); });
...@@ -3799,6 +3804,9 @@ this._instances.splice(keys.length, this._instances.length - keys.length); ...@@ -3799,6 +3804,9 @@ this._instances.splice(keys.length, this._instances.length - keys.length);
_keySort: function (a, b) { _keySort: function (a, b) {
return this.collection.getKey(a) - this.collection.getKey(b); return this.collection.getKey(a) - this.collection.getKey(b);
}, },
_numericSort: function (a, b) {
return a - b;
},
_applySplicesUserSort: function (splices) { _applySplicesUserSort: function (splices) {
var c = this.collection; var c = this.collection;
var instances = this._instances; var instances = this._instances;
...@@ -3826,7 +3834,7 @@ addedKeys.push(key); ...@@ -3826,7 +3834,7 @@ addedKeys.push(key);
} }
} }
if (removedIdxs.length) { if (removedIdxs.length) {
removedIdxs.sort(); removedIdxs.sort(this._numericSort);
for (var i = removedIdxs.length - 1; i >= 0; i--) { for (var i = removedIdxs.length - 1; i >= 0; i--) {
var idx = removedIdxs[i]; var idx = removedIdxs[i];
if (idx !== undefined) { if (idx !== undefined) {
...@@ -4009,6 +4017,10 @@ selected: { ...@@ -4009,6 +4017,10 @@ selected: {
type: Object, type: Object,
notify: true notify: true
}, },
selectedItem: {
type: Object,
notify: true
},
toggle: { toggle: {
type: Boolean, type: Boolean,
value: false value: false
...@@ -4031,6 +4043,7 @@ this._selectedColl = Polymer.Collection.get(this.selected); ...@@ -4031,6 +4043,7 @@ this._selectedColl = Polymer.Collection.get(this.selected);
this.selected = null; this.selected = null;
this._selectedColl = null; this._selectedColl = null;
} }
this.selectedItem = null;
}, },
isSelected: function (item) { isSelected: function (item) {
if (this.multi) { if (this.multi) {
...@@ -4048,7 +4061,9 @@ this.unlinkPaths('selected.' + skey); ...@@ -4048,7 +4061,9 @@ this.unlinkPaths('selected.' + skey);
} }
} else { } else {
this.selected = null; this.selected = null;
this.selectedItem = null;
this.unlinkPaths('selected'); this.unlinkPaths('selected');
this.unlinkPaths('selectedItem');
} }
}, },
select: function (item) { select: function (item) {
...@@ -4068,8 +4083,10 @@ this.linkPaths('selected.' + skey, 'items.' + key); ...@@ -4068,8 +4083,10 @@ this.linkPaths('selected.' + skey, 'items.' + key);
if (this.toggle && item == this.selected) { if (this.toggle && item == this.selected) {
this.deselect(); this.deselect();
} else { } else {
this.linkPaths('selected', 'items.' + key);
this.selected = item; this.selected = item;
this.selectedItem = item;
this.linkPaths('selected', 'items.' + key);
this.linkPaths('selectedItem', 'items.' + key);
} }
} }
} }
......
/**
* @license
* 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
*/
// @version 0.7.14
window.WebComponents=window.WebComponents||{},function(e){var t=e.flags||{},n="webcomponents-lite.js",r=document.querySelector('script[src*="'+n+'"]');if(!t.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var n,r=e.split("=");r[0]&&(n=r[0].match(/wc-(.+)/))&&(t[n[1]]=r[1]||!0)}),r)for(var o,i=0;o=r.attributes[i];i++)"src"!==o.name&&(t[o.name]=o.value||!0);if(t.log){var a=t.log.split(",");t.log={},a.forEach(function(e){t.log[e]=!0})}else t.log={}}t.shadow=t.shadow||t.shadowdom||t.polyfill,"native"===t.shadow?t.shadow=!1:t.shadow=t.shadow||!HTMLElement.prototype.createShadowRoot,t.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=t.register),e.flags=t}(window.WebComponents),function(e){"use strict";function t(e){return void 0!==h[e]}function n(){s.call(this),this._isInvalid=!0}function r(e){return""==e&&n.call(this),e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){g.push(e)}var d=a||"scheme start",u=0,l="",w=!1,_=!1,g=[];e:for(;(e[u-1]!=p||0==u)&&!this._isInvalid;){var b=e[u];switch(d){case"scheme start":if(!b||!m.test(b)){if(a){c("Invalid scheme.");break e}l="",d="no scheme";continue}l+=b.toLowerCase(),d="scheme";break;case"scheme":if(b&&v.test(b))l+=b.toLowerCase();else{if(":"!=b){if(a){if(p==b)break e;c("Code point not allowed in scheme: "+b);break e}l="",u=0,d="no scheme";continue}if(this._scheme=l,l="",a)break e;t(this._scheme)&&(this._isRelative=!0),d="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==b?(this._query="?",d="query"):"#"==b?(this._fragment="#",d="fragment"):p!=b&&" "!=b&&"\n"!=b&&"\r"!=b&&(this._schemeData+=o(b));break;case"no scheme":if(s&&t(s._scheme)){d="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=b||"/"!=e[u+1]){c("Expected /, got: "+b),d="relative";continue}d="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),p==b){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==b||"\\"==b)"\\"==b&&c("\\ is an invalid code point."),d="relative slash";else if("?"==b)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,d="query";else{if("#"!=b){var y=e[u+1],E=e[u+2];("file"!=this._scheme||!m.test(b)||":"!=y&&"|"!=y||p!=E&&"/"!=E&&"\\"!=E&&"?"!=E&&"#"!=E)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),d="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,d="fragment"}break;case"relative slash":if("/"!=b&&"\\"!=b){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),d="relative path";continue}"\\"==b&&c("\\ is an invalid code point."),d="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=b){c("Expected '/', got: "+b),d="authority ignore slashes";continue}d="authority second slash";break;case"authority second slash":if(d="authority ignore slashes","/"!=b){c("Expected '/', got: "+b);continue}break;case"authority ignore slashes":if("/"!=b&&"\\"!=b){d="authority";continue}c("Expected authority, got: "+b);break;case"authority":if("@"==b){w&&(c("@ already seen."),l+="%40"),w=!0;for(var L=0;L<l.length;L++){var M=l[L];if(" "!=M&&"\n"!=M&&"\r"!=M)if(":"!=M||null!==this._password){var T=o(M);null!==this._password?this._password+=T:this._username+=T}else this._password="";else c("Invalid whitespace in authority.")}l=""}else{if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){u-=l.length,l="",d="host";continue}l+=b}break;case"file host":if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){2!=l.length||!m.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?d="relative path start":(this._host=r.call(this,l),l="",d="relative path start"):d="relative path";continue}" "==b||"\n"==b||"\r"==b?c("Invalid whitespace in file host."):l+=b;break;case"host":case"hostname":if(":"!=b||_){if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){if(this._host=r.call(this,l),l="",d="relative path start",a)break e;continue}" "!=b&&"\n"!=b&&"\r"!=b?("["==b?_=!0:"]"==b&&(_=!1),l+=b):c("Invalid code point in host/hostname: "+b)}else if(this._host=r.call(this,l),l="",d="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(b))l+=b;else{if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b||a){if(""!=l){var N=parseInt(l,10);N!=h[this._scheme]&&(this._port=N+""),l=""}if(a)break e;d="relative path start";continue}" "==b||"\n"==b||"\r"==b?c("Invalid code point in port: "+b):n.call(this)}break;case"relative path start":if("\\"==b&&c("'\\' not allowed in path."),d="relative path","/"!=b&&"\\"!=b)continue;break;case"relative path":if(p!=b&&"/"!=b&&"\\"!=b&&(a||"?"!=b&&"#"!=b))" "!=b&&"\n"!=b&&"\r"!=b&&(l+=o(b));else{"\\"==b&&c("\\ not allowed in relative path.");var O;(O=f[l.toLowerCase()])&&(l=O),".."==l?(this._path.pop(),"/"!=b&&"\\"!=b&&this._path.push("")):"."==l&&"/"!=b&&"\\"!=b?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&m.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==b?(this._query="?",d="query"):"#"==b&&(this._fragment="#",d="fragment")}break;case"query":a||"#"!=b?p!=b&&" "!=b&&"\n"!=b&&"\r"!=b&&(this._query+=i(b)):(this._fragment="#",d="fragment");break;case"fragment":p!=b&&" "!=b&&"\n"!=b&&"\r"!=b&&(this._fragment+=b)}u++}}function s(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var d=!1;if(!e.forceJURL)try{var u=new URL("b","http://a");u.pathname="c%20d",d="http://a/c%20d"===u.href}catch(l){}if(!d){var h=Object.create(null);h.ftp=21,h.file=0,h.gopher=70,h.http=80,h.https=443,h.ws=80,h.wss=443;var f=Object.create(null);f["%2e"]=".",f[".%2e"]="..",f["%2e."]="..",f["%2e%2e"]="..";var p=void 0,m=/[a-zA-Z]/,v=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return(""!=this._username||null!=this._password)&&(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var w=e.URL;w&&(c.createObjectURL=function(e){return w.createObjectURL.apply(w,arguments)},c.revokeObjectURL=function(e){w.revokeObjectURL(e)}),e.URL=c}}(self),"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){b.push(e),g||(g=!0,m(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){g=!1;var e=b;b=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=v.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++y}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function d(e,t){return E=new s(e,t)}function u(e){return L?L:(L=c(E),L.oldValue=e,L)}function l(){E=L=void 0}function h(e){return e===L||e===E}function f(e,t){return e===t?e:L&&h(e)?L:null}function p(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var m,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var w=[],_=String(Math.random());window.addEventListener("message",function(e){if(e.data===_){var t=w;w=[],t.forEach(function(e){e()})}}),m=function(e){w.push(e),window.postMessage(_,"*")}}var g=!1,b=[],y=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=v.get(e);r||v.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new p(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var E,L;p.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=f(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new d("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=d("characterData",r),a=e.prevValue;i(r,function(e){return e.characterData?e.characterDataOldValue?u(a):o:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,h=e.target;"DOMNodeInserted"===e.type?(s=[h],c=[]):(s=[],c=[h]);var f=h.previousSibling,p=h.nextSibling,o=d("childList",e.target.parentNode);o.addedNodes=s,o.removedNodes=c,o.previousSibling=f,o.nextSibling=p,i(e.relatedNode,function(e){return e.childList?o:void 0})}l()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a)}(self),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||p,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===w}function r(e,t){if(n(t))e&&e();else{var o=function(){("complete"===t.readyState||t.readyState===w)&&(t.removeEventListener(_,o),r(e,t))};t.addEventListener(_,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){c==d&&e&&e({allImports:s,loadedImports:u,errorImports:l})}function r(e){o(e),u.push(this),c++,n()}function i(e){l.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,d=s.length,u=[],l=[];if(d)for(var h,f=0;d>f&&(h=s[f]);f++)a(h)?(c++,n()):(h.addEventListener("load",r),h.addEventListener("error",i));else n()}function a(e){return l?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)c(t)&&d(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function d(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",l=Boolean(u in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),f=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},p=f(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return f(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(p,"_currentScript",m);var v=/Trident/.test(navigator.userAgent),w=v?"complete":"interactive",_="readystatechange";l&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)d(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=p.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),p.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=l,e.rootDocument=p,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=i.getResponseHeader("Location"),a=null;if(n)var a="/"===n.substr(0,1)?location.origin+n:n;r.call(o,!t.ok(i)&&i,i.response||i.responseText,a)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,d=e.isIE,u=e.IMPORT_LINK_TYPE,l="link[rel="+u+"]",h={documentSelectors:l,importsSelectors:[l,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),d&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return t(e)&&void 0===e.__doc?!1:!0}};e.parser=h,e.IMPORT_SELECTOR=l}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,d=e.Loader,u=e.Observer,l=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){f.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);f.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:o(r,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}l.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),l.parseNext()},loadedAll:function(){l.parseNext()}},f=new d(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new u,!document.baseURI){var p={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",p),Object.defineProperty(c,"baseURI",p)}e.importer=h,e.importLoader=f}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(o)}var n=e.initializeModules,r=e.isIE;if(!e.useNative){(!window.CustomEvent||r&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n.preventDefault=function(){Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})},n},window.CustomEvent.prototype=window.Event.prototype),n();var o=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var r,o=e.querySelectorAll("link[rel="+a+"]"),s=0,c=o.length;c>s&&(r=o[s]);s++)r["import"]&&i(r["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||r(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function r(e,t){g(e,function(e){return n(e,t)?!0:void 0})}function o(e){L.push(e),E||(E=!0,setTimeout(i))}function i(){E=!1;for(var e,t=L,n=0,r=t.length;r>n&&(e=t[n]);n++)e();L=[]}function a(e){y?o(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){d(e),g(e,function(e){d(e)})}function d(e){y?o(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function l(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function h(e){if(e.shadowRoot&&!e.shadowRoot.__watched){_.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function f(e,n){if(_.dom){var r=n[0];if(r&&"childList"===r.type&&r.addedNodes&&r.addedNodes){for(var o=r.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var i=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=l(e);n.forEach(function(e){"childList"===e.type&&(M(e.addedNodes,function(e){e.localName&&t(e,a)}),M(e.removedNodes,function(e){e.localName&&c(e)}))}),_.dom&&console.groupEnd()}function p(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(f(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(f.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),_.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),_.dom&&console.groupEnd()}function w(e){b(e,v)}var _=e.flags,g=e.forSubtree,b=e.forDocumentTree,y=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;e.hasPolyfillMutations=y;var E=!1,L=[],M=Array.prototype.forEach.call.bind(Array.prototype.forEach),T=Element.prototype.createShadowRoot;T&&(Element.prototype.createShadowRoot=function(){var e=T.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=h,e.upgradeDocumentTree=w,e.upgradeDocument=v,e.upgradeSubtree=r,e.upgradeAll=t,e.attached=a,e.takeRecords=p}),window.CustomElements.addModule(function(e){function t(t,r){if(!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(o);if(i&&(o&&i.tag==t.localName||!o&&!i["extends"]))return n(t,i,r)}}function n(t,n,o){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),o&&e.attached(t),e.upgradeSubtree(t,o),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),window.CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(d(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=l(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&w(document),c.ctor;
}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t<E.length;t++)if(e===E[t])return!0}function i(e){var t=d(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],r=0;t=e.ancestry[r];r++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var r,o=e.prototype,i=!1;o;)o==t&&(i=!0),r=Object.getPrototypeOf(o),r&&(o.__proto__=r),o=r;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return g(T(e.tag),e)}function d(e){return e?L[e.toLowerCase()]:void 0}function u(e,t){L[e]=t}function l(e){return function(){return c(e)}}function h(e,t,n){return e===M?f(t,n):N(e,t)}function f(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=d(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var r;return t?(r=f(e),r.setAttribute("is",t),r):(r=T(e),e.indexOf("-")>=0&&b(r,HTMLElement),r)}function p(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return _(e),e}}var m,v=e.isIE,w=e.upgradeDocumentTree,_=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,y=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],L={},M="http://www.w3.org/1999/xhtml",T=document.createElement.bind(document),N=document.createElementNS.bind(document);m=Object.__proto__||y?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},p(Node.prototype,"cloneNode"),p(document,"importNode"),v&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType==t.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}(),document.registerElement=t,document.createElement=f,document.createElementNS=h,e.registry=L,e["instanceof"]=m,e.reservedTagList=E,e.getRegisteredDefinition=d,document.register=document.registerElement}),function(e){function t(){a(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,r=e.initializeModules,o=e.isIE;if(n){var i=function(){};e.watchShadow=i,e.upgrade=i,e.upgradeAll=i,e.upgradeDocumentTree=i,e.upgradeSubtree=i,e.takeRecords=i,e["instanceof"]=function(e,t){return e instanceof t}}else r();var a=e.upgradeDocumentTree,s=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&s(wrap(e["import"]))}),(!window.CustomEvent||o&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n.preventDefault=function(){Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})},n},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,t)}else t()}(window.CustomElements),"undefined"==typeof HTMLTemplateElement&&!function(){function e(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case" ":return"&nbsp;"}}function t(t){return t.replace(a,e)}var n="template",r=document.implementation.createHTMLDocument("template"),o=!0;HTMLTemplateElement=function(){},HTMLTemplateElement.prototype=Object.create(HTMLElement.prototype),HTMLTemplateElement.decorate=function(e){e.content||(e.content=r.createDocumentFragment());for(var n;n=e.firstChild;)e.content.appendChild(n);if(o)try{Object.defineProperty(e,"innerHTML",{get:function(){for(var e="",n=this.content.firstChild;n;n=n.nextSibling)e+=n.outerHTML||t(n.data);return e},set:function(e){for(r.body.innerHTML=e,HTMLTemplateElement.bootstrap(r);this.content.firstChild;)this.content.removeChild(this.content.firstChild);for(;r.body.firstChild;)this.content.appendChild(r.body.firstChild)},configurable:!0})}catch(i){o=!1}},HTMLTemplateElement.bootstrap=function(e){for(var t,r=e.querySelectorAll(n),o=0,i=r.length;i>o&&(t=r[o]);o++)HTMLTemplateElement.decorate(t)},window.addEventListener("DOMContentLoaded",function(){HTMLTemplateElement.bootstrap(document)});var i=document.createElement;document.createElement=function(){"use strict";var e=i.apply(document,arguments);return"template"==e.localName&&HTMLTemplateElement.decorate(e),e};var a=/[&\u00A0<>]/g}(),function(e){"use strict";if(!window.performance){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}())}(window.WebComponents),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents);
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
<html><head><meta charset="UTF-8"><!--
@license
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
--><!--
@license
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
--></head><body><div hidden="" by-vulcanize=""><dom-module id="iron-localstorage" assetpath="../bower_components/iron-localstorage/"></dom-module>
<dom-module id="td-model" assetpath="/">
<template>
<iron-localstorage name="todos-polymer" value="{{items}}" on-iron-localstorage-load-empty="_initializeDefaultTodos"></iron-localstorage>
</template>
</dom-module>
<dom-module id="td-item" assetpath="/">
<template>
<template is="dom-if" if="{{!editing}}">
<div on-dblclick="_editAction">
<input type="checkbox" class="toggle" checked="{{item.completed::change}}">
<label>{{item.title}}</label>
<button class="destroy" on-tap="_destroyAction"></button>
</div>
</template>
<template is="dom-if" if="{{editing}}">
<input is="td-input" id="edit" class="edit" value="{{_editingValue::input}}" on-td-input-commit="_commitAction" on-td-input-cancel="_cancelAction" on-blur="_onBlur">
</template>
</template>
</dom-module>
<dom-module id="td-todos" assetpath="/">
<template>
<style> :host { display: block; } </style>
<flatiron-director route="{{route}}" hidden=""></flatiron-director>
<section id="todoapp">
<header id="header">
<input is="td-input" id="new-todo" placeholder="What needs to be done?" autofocus="" on-td-input-commit="addTodoAction" on-td-input-cancel="cancelAddTodoAction">
</header>
<template is="dom-if" if="{{items.length}}">
<section id="main">
<input id="toggle-all" type="checkbox" checked="[[allCompleted]]" on-change="toggleAllCompletedAction">
<label for="toggle-all">Mark all as complete</label>
<ul id="todo-list" on-td-destroy-item="destroyItemAction">
<template id="todo-list-repeater" is="dom-repeat" items="{{items}}" filter="{{matchesFilter(route)}}" observe="completed">
<li is="td-item" item="{{item}}"></li>
</template>
</ul>
</section>
<footer id="footer">
<span id="todo-count">
<strong>{{activeCount}}</strong>
<span>{{_computeItemsLeft(activeCount)}}</span> left
</span>
<iron-selector id="filters" selected="{{route}}" attr-for-selected="route">
<li route="">
<a href="#/" class$="{{_computeLinkClass(route, '')}}">All</a>
</li>
<li route="active">
<a href="#/active" class$="{{_computeLinkClass(route, 'active')}}">Active</a>
</li>
<li route="completed">
<a href="#/completed" class$="{{_computeLinkClass(route, 'completed')}}">Completed</a>
</li>
</iron-selector>
<template is="dom-if" if="{{anyCompleted}}">
<button id="clear-completed" on-tap="clearCompletedAction" style="visibility:visible">Clear completed</button>
</template>
</footer>
</template>
</section>
</template>
</dom-module>
</div><script src="elements.build.js"></script></body></html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
<link rel="import" href="td-model.html">
<link rel="import" href="td-todos.html">
<link rel="import" href="../bower_components/polymer/polymer.html"> <link rel="import" href="../bower_components/polymer/polymer.html">
<dom-module id="td-input"> <script>
<script> (function() {
(function() {
'use strict'; 'use strict';
var ENTER_KEY = 13; var ENTER_KEY = 13;
var ESC_KEY = 27; var ESC_KEY = 27;
Polymer({ Polymer({
is: 'td-input', is: 'td-input',
extends: 'input', extends: 'input',
listeners: { listeners: {
'keyup': 'keyupAction', 'keyup': '_keyupAction',
'keypress': 'keypressAction' 'keypress': '_keypressAction'
}, },
keypressAction: function(e, detail, sender) {
_keypressAction: function(e, detail, sender) {
// Listen for enter on keypress but esc on keyup, because // Listen for enter on keypress but esc on keyup, because
// IE doesn't fire keyup for enter. // IE doesn't fire keyup for enter.
if (e.keyCode === ENTER_KEY) { if (e.keyCode === ENTER_KEY) {
this.fire('td-input-commit'); this.fire('td-input-commit');
} }
}, },
keyupAction: function(e, detail, sender) {
_keyupAction: function(e, detail, sender) {
if (e.keyCode === ESC_KEY) { if (e.keyCode === ESC_KEY) {
this.fire('td-input-cancel'); this.fire('td-input-cancel');
} }
} }
}); });
})(); })();
</script> </script>
</dom-module>
...@@ -4,14 +4,19 @@ ...@@ -4,14 +4,19 @@
<dom-module id="td-item"> <dom-module id="td-item">
<template> <template>
<template is="dom-if" if="{{!editing}}"> <template is="dom-if" if="{{!editing}}">
<div on-dblclick="editAction"> <div on-dblclick="_editAction">
<input type="checkbox" class="toggle" checked="{{item.completed::change}}" on-click="itemChangeAction"> <input type="checkbox" class="toggle"
checked="{{item.completed::change}}">
<label>{{item.title}}</label> <label>{{item.title}}</label>
<button class="destroy" on-click="destroyAction"></button> <button class="destroy" on-tap="_destroyAction"></button>
</div> </div>
</template> </template>
<template is="dom-if" if="{{editing}}"> <template is="dom-if" if="{{editing}}">
<input is="td-input" id="edit" class="edit" value$="{{item.title}}" on-td-input-commit="commitAction" on-td-input-cancel="cancelAction" on-blur="onBlur"> <input is="td-input" id="edit" class="edit"
value="{{_editingValue::input}}"
on-td-input-commit="_commitAction"
on-td-input-cancel="_cancelAction"
on-blur="_onBlur">
</template> </template>
</template> </template>
<script> <script>
...@@ -20,7 +25,9 @@ ...@@ -20,7 +25,9 @@
Polymer({ Polymer({
is: 'td-item', is: 'td-item',
extends: 'li', extends: 'li',
properties: { properties: {
editing: { editing: {
type: Boolean, type: Boolean,
...@@ -28,49 +35,48 @@ ...@@ -28,49 +35,48 @@
}, },
item: { item: {
type: Object, type: Object,
value: function() { value: function() { return {}; }
return {};
}
}, },
}, },
observers: ['setRootClass(item.completed, editing)'],
setRootClass: function(completed, editing) { observers: ['setHostClass(item.completed, editing)'],
this.classList[completed ? 'add' : 'remove']('completed');
this.classList[editing ? 'add' : 'remove']('editing'); setHostClass: function(completed, editing) {
// Note: TodoMVC has styling for classes. Too bad we can't use the
// editing property and reflectToAttribute.
this.toggleClass('completed', completed);
this.toggleClass('editing', editing);
}, },
onBlur: function() {
this.commitAction(); _onBlur: function() {
this._commitAction();
this.editing = false; this.editing = false;
}, },
editAction: function() {
_editAction: function() {
this.editing = true; this.editing = true;
this._editingValue = this.item.title;
// Wait one tick template to stamp.
this.async(function() { this.async(function() {
var elm = this.querySelector('#edit'); this.querySelector('#edit').focus();
// It looks like polymer is trying to be smart here and not updating the
// title attribute on the input when it is changed. To work around this, we manually have
// to set the value again when we go into edit mode.
elm.value = this.item.title;
elm.focus();
}); });
}, },
commitAction: function() {
_commitAction: function() {
if (this.editing) { if (this.editing) {
this.editing = false; this.editing = false;
this.set('item.title', this.querySelector('#edit').value.trim()); this.set('item.title', this._editingValue.trim());
if (this.item.title === '') { if (this.item.title === '') {
this.destroyAction(); this._destroyAction();
} }
this.fire('td-item-changed');
} }
}, },
cancelAction: function() {
_cancelAction: function() {
this.editing = false; this.editing = false;
}, },
itemChangeAction: function(e, details) {
this.set('item.completed', e.target.checked); _destroyAction: function() {
this.fire('td-item-changed');
},
destroyAction: function() {
this.fire('td-destroy-item', this.item); this.fire('td-destroy-item', this.item);
} }
}); });
......
<link rel="import" href="../bower_components/polymer/polymer.html"> <link rel="import" href="../bower_components/polymer/polymer.html">
<link rel="import" href="../bower_components/iron-localstorage/iron-localstorage.html">
<dom-module id="td-model"> <dom-module id="td-model">
<template> <template>
<iron-localstorage name="todos-polymer" value="{{items}}" on-iron-localstorage-load-empty="initializeDefaultTodos"></iron-localstorage> <iron-localstorage name="todos-polymer" value="{{items}}"
on-iron-localstorage-load-empty="_initializeDefaultTodos"></iron-localstorage>
</template> </template>
<script> <script>
(function() { (function() {
...@@ -10,16 +12,25 @@ ...@@ -10,16 +12,25 @@
Polymer({ Polymer({
is: 'td-model', is: 'td-model',
hostAttributes: {
hidden: true
},
properties: { properties: {
items: { items: {
type: Array, type: Array,
notify: true notify: true
}, },
filter: String filter: {
type: String
}
}, },
initializeDefaultTodos: function() {
_initializeDefaultTodos: function() {
this.items = []; this.items = [];
}, },
newItem: function(title) { newItem: function(title) {
title = String(title).trim(); title = String(title).trim();
...@@ -27,50 +38,39 @@ ...@@ -27,50 +38,39 @@
return; return;
} }
this.push('items', { this.push('items', {title: title, completed: false});
title: title,
completed: false
});
}, },
getCompletedCount: function(items) {
return items === null ? 0 : items.filter(this.filters.completed).length getCompletedCount: function() {
}, return this.items ? this.items.filter(this.filters.completed).length : 0;
getActiveCount: function(items) {
return items.length - this.getCompletedCount(items);
}, },
areAllCompleted: function(items) {
return this.getCompletedCount(items) && !this.getActiveCount(items) ? true : false; getActiveCount: function() {
return this.items.length - this.getCompletedCount(this.items);
}, },
matchesFilter: function(item, filter) { matchesFilter: function(item, filter) {
var fn = this.filters[filter]; var fn = this.filters[filter];
return this.filtered = fn ? fn(item) : true; return fn ? fn(item) : true;
}, },
destroyItem: function(item) { destroyItem: function(item) {
var i = this.items.indexOf(item); var i = this.items.indexOf(item);
if (i > -1) {
i !== -1 && this.splice('items', i, 1); this.splice('items', i, 1)
}
}, },
clearCompletedItems: function (){
clearCompletedItems: function() {
this.items = this.items.filter(this.filters.active); this.items = this.items.filter(this.filters.active);
}, },
setItemsCompleted: function(completed) { setItemsCompleted: function(completed) {
// Since we are mutating elements in an array here for (var i = 0; i < this.items.length; ++i) {
// and we want everyone to know about it we must go through this.set(['items', i, 'completed'], completed);
// the polymer internal `splice` api. The fix that comes to my mind here
// would be to use a hash or set to represent this structure so that the mutations
// would happening on an object with real key value pairs instead of an object
// nested inside of an array
// Polymer array mutation docs: https://www.polymer-project.org/1.0/docs/devguide/properties.html#array-mutation
this.items.forEach(function(item, i) {
if (this.filter) {
if (this.filters[this.filter](item)) {
this.splice('items', i, 1, {title: item.title, completed: completed});
} }
} else {
this.splice('items', i, 1, {title: item.title, completed: completed});
}
}, this);
}, },
filters: { filters: {
active: function(item) { active: function(item) {
return !item.completed; return !item.completed;
......
...@@ -6,140 +6,142 @@ ...@@ -6,140 +6,142 @@
<dom-module id="td-todos"> <dom-module id="td-todos">
<template> <template>
<flatiron-director id="router" route="{{route}}"></flatiron-director> <style>
:host {
display: block;
}
</style>
<flatiron-director route="{{route}}" hidden></flatiron-director>
<section id="todoapp"> <section id="todoapp">
<header id="header"> <header id="header">
<input is="td-input" id="new-todo" placeholder="What needs to be done?" autofocus on-td-input-commit="addTodoAction" on-td-input-cancel="cancelAddTodoAction"> <input is="td-input" id="new-todo"
placeholder="What needs to be done?" autofocus
on-td-input-commit="addTodoAction"
on-td-input-cancel="cancelAddTodoAction">
</header> </header>
<template is="dom-if" if="{{hasTodos(items.length)}}">
<template is="dom-if" if="{{items.length}}">
<section id="main"> <section id="main">
<input id="toggle-all" type="checkbox" on-change="toggleAllCompletedAction" checked="[[areAllCompleted]]"> <input id="toggle-all" type="checkbox" checked="[[allCompleted]]"
on-change="toggleAllCompletedAction">
<label for="toggle-all">Mark all as complete</label> <label for="toggle-all">Mark all as complete</label>
<ul id="todo-list" on-td-destroy-item="destroyItemAction"> <ul id="todo-list" on-td-destroy-item="destroyItemAction">
<template id="todo-list-repeater" is="dom-repeat" items="{{items}}" filter="matchesFilter" observe="completed"> <template id="todo-list-repeater" is="dom-repeat" items="{{items}}"
filter="{{matchesFilter(route)}}" observe="completed">
<li is="td-item" item="{{item}}"></li> <li is="td-item" item="{{item}}"></li>
</template> </template>
</ul> </ul>
</section> </section>
</template>
<template is="dom-if" if="{{hasTodos(items.length)}}">
<footer id="footer"> <footer id="footer">
<span id="todo-count"><strong>{{getActiveCount(items, items.*)}}</strong> <span>{{getItemWord(items, items.*)}}</span> left</span> <span id="todo-count">
<iron-selector on-tap="onTap" id="filters" selected="{{getSelectedRoute(route)}}}}" attr-for-selected="name"> <strong>{{activeCount}}</strong>
<li name="all"> <span>{{_computeItemsLeft(activeCount)}}</span> left
<a href="#/">All</a> </span>
<iron-selector id="filters" selected="{{route}}" attr-for-selected="route">
<li route="">
<a href="#/" class$="{{_computeLinkClass(route, '')}}">All</a>
</li> </li>
<li name="active"> <li route="active">
<a href="#/active">Active</a> <a href="#/active" class$="{{_computeLinkClass(route, 'active')}}">Active</a>
</li> </li>
<li name="completed"> <li route="completed">
<a href="#/completed">Completed</a> <a href="#/completed" class$="{{_computeLinkClass(route, 'completed')}}">Completed</a>
</li> </li>
</iron-selector> </iron-selector>
<template is="dom-if" if="{{anyCompleted(items, items.*)}}">
<button id="clear-completed" on-click="clearCompletedAction" style="visibility:visible">Clear completed</button> <template is="dom-if" if="{{anyCompleted}}">
<button id="clear-completed" on-tap="clearCompletedAction"
style="visibility:visible">Clear completed</button>
</template> </template>
</footer> </footer>
</template> </template>
</section> </section>
</template> </template>
<script> <script>
(function() { (function() {
'use strict'; 'use strict';
var ENTER_KEY = 13;
var ESC_KEY = 27;
Polymer({ Polymer({
is: 'td-todos', is: 'td-todos',
properties: { properties: {
modelId: String,
areAllCompleted: {
type: Boolean,
computed: 'allCompleted(items.*)'
},
items: { items: {
type: Array type: Array
}, },
model: { model: {
type: Object type: Object
}, },
route: { modelId: {
type: String, type: String
observer: 'refreshFiltered'
}
},
onTap: function() {
this.setActiveFilterChildClass();
},
setActiveFilterChildClass: function() {
// iron-selector should maybe allow selecting of arbitrary subnodes?
var filters = this.querySelector('#filters');
var prev = filters.querySelector('a.selected');
prev && prev.classList.remove('selected');
this.async(function() {
filters.selectedItem.querySelector('a').classList.add('selected');
});
},
getSelectedRoute: function(route) {
return route || 'all';
}, },
anyCompleted: function(items) { route: {
return this.model.getCompletedCount(items) > 0; type: String
}, },
getActiveCount: function(items) { allCompleted: {
return this.model.getActiveCount(items); type: Boolean,
computed: '_computeAllCompleted(anyCompleted, activeCount)'
}, },
refreshFiltered: function() { activeCount: {
// WAT: So it would be nice if repeat would be able to "observe" and external instance prop type: Number,
// since it does not we have to "hack" this. computed: '_computeActiveCount(items, items.*)'
var elm = this.querySelector('#todo-list-repeater');
elm && elm._applyFullRefresh();
}, },
matchesFilter: function(item) { anyCompleted: {
return this.model.matchesFilter(item, this.route); type: Boolean,
computed: '_computeAnyCompleted(items, items.*)'
}
}, },
attached: function() { attached: function() {
document.querySelector('#router').addEventListener('director-route', this.routeChanged.bind(this)); this.model = document.querySelector('#' + this.modelId);
},
// get a reference to the "model" which is our datastore interface _computeLinkClass: function(currRoute, route) {
this.set('model', document.querySelector('#model')); return currRoute === route ? 'selected' : '';
},
// this seems like smell... however I am not sure of a better way _computeAnyCompleted: function(items) {
this.addEventListener('dom-change', function() { return this.model ? this.model.getCompletedCount() > 0 : false;
if (this.querySelector('#filters') !== null) {
this.setActiveFilterChildClass();
this.removeEventListener('dom-change');
}
});
}, },
allCompleted: function(items) {
return this.model.areAllCompleted(this.items); _computeActiveCount: function(items) {
return this.model ? this.model.getActiveCount() : 0;
}, },
getItemWord: function(items) {
return items.length === 1 ? 'item' : 'items'; _computeAllCompleted: function(anyCompleted, activeCount) {
return anyCompleted && !activeCount;
}, },
hasTodos: function(todoCount) {
return todoCount > 0; _computeItemsLeft: function(count) {
return count < 2 ? 'item' : 'items';
}, },
routeChanged: function(e) {
this.model.filter = e.detail; matchesFilter: function(route) {
return function(item, index, array) {
return this.model ? this.model.matchesFilter(item, route) : false;
}.bind(this);
}, },
addTodoAction: function() { addTodoAction: function() {
this.model.newItem(this.$['new-todo'].value); this.model.newItem(this.$['new-todo'].value);
// when polyfilling Object.observe, make sure we update immediately
this.$['new-todo'].value = ''; this.$['new-todo'].value = '';
}, },
cancelAddTodoAction: function() { cancelAddTodoAction: function() {
this.$['new-todo'].value = ''; this.$['new-todo'].value = '';
}, },
destroyItemAction: function(e, detail) { destroyItemAction: function(e, detail) {
this.model.destroyItem(detail); this.model.destroyItem(detail);
}, },
toggleAllCompletedAction: function(e) { toggleAllCompletedAction: function(e) {
this.model.setItemsCompleted(e.target.checked); this.model.setItemsCompleted(e.target.checked);
}, },
clearCompletedAction: function() { clearCompletedAction: function() {
this.model.clearCompletedItems(); this.model.clearCompletedItems();
} }
......
...@@ -3,26 +3,25 @@ ...@@ -3,26 +3,25 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Polymer • TodoMVC</title> <title>Polymer • TodoMVC</title>
<script src="bower_components/webcomponentsjs/webcomponents.js"></script> <script src="bower_components/webcomponentsjs/webcomponents-lite.min.js" async></script>
<link rel="stylesheet" href="bower_components/todomvc-common/base.css"> <link rel="stylesheet" href="bower_components/todomvc-common/base.css">
<link rel="stylesheet" href="bower_components/todomvc-app-css/index.css"> <link rel="stylesheet" href="bower_components/todomvc-app-css/index.css">
<link rel="import" href="bower_components/iron-localstorage/iron-localstorage.html"> <link rel="import" href="elements/elements.build.html" async>
<link rel="import" href="elements/td-model.html"> <!-- <link rel="import" href="elements/elements.html"> -->
<link rel="import" href="elements/td-todos.html">
</head> </head>
<body> <body>
<div id="todoapp"> <div id="todoapp">
<header> <header>
<h1>todos</h1> <h1>todos</h1>
</header> </header>
<template is="dom-bind" id="root"> <template is="dom-bind">
<td-model id="model" items="{{todos}}"></td-model> <td-model id="model" items="{{todos}}"></td-model>
<td-todos items="{{todos}}"></td-todos> <td-todos model-id="model" items="{{todos}}"></td-todos>
</template> </template>
</div> </div>
<footer id="info"> <footer id="info">
<p>Double-click to edit a todo</p> <p>Double-click to edit a todo</p>
<p>Created by <a href="http://www.polymer-project.org">The Polymer Authors</a></p> <p>Created by <a href="https://www.polymer-project.org/1.0/">The Polymer Authors</a></p>
<p>Part of <a href="http://todomvc.com">TodoMVC</a></p> <p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
</footer> </footer>
<script src="bower_components/todomvc-common/base.js"></script> <script src="bower_components/todomvc-common/base.js"></script>
......
{
"name": "polymer-todomvc",
"version": "1.0.0",
"description": "Polymer TodoMVC demo",
"main": "index.html",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://github.com/tastejs/todomvc"
},
"keywords": [
"polymer",
"todomvc"
],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/tastejs/todomvc/issues"
},
"homepage": "https://github.com/tastejs/todomvc",
"devDependencies": {
"polybuild": "^1.0.5"
}
}
#!/bin/sh
# vulcanize elements.html \
# --inline-script --inline-css --strip-comments | \
# crisper -h elements.build.html -j elements.build.js
polybuild --maximum-crush elements/elements.html
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment