polymer-paper-elements-rails 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +51 -0
- data/Rakefile +1 -0
- data/app/assets/components/iron-a11y-announcer/iron-a11y-announcer.html +125 -0
- data/app/assets/components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html +418 -0
- data/app/assets/components/iron-autogrow-textarea/hero.svg +33 -0
- data/app/assets/components/iron-autogrow-textarea/iron-autogrow-textarea.html +263 -0
- data/app/assets/components/iron-behaviors/iron-button-state.html +195 -0
- data/app/assets/components/iron-behaviors/iron-control-state.html +102 -0
- data/app/assets/components/iron-fit-behavior/iron-fit-behavior.html +230 -0
- data/app/assets/components/iron-flex-layout/classes/iron-flex-layout.html +307 -0
- data/app/assets/components/iron-flex-layout/classes/iron-shadow-flex-layout.html +302 -0
- data/app/assets/components/iron-flex-layout/iron-flex-layout.html +313 -0
- data/app/assets/components/iron-form-element-behavior/iron-form-element-behavior.html +50 -0
- data/app/assets/components/iron-icon/hero.svg +19 -0
- data/app/assets/components/iron-icon/iron-icon.html +187 -0
- data/app/assets/components/iron-icons/av-icons.html +73 -0
- data/app/assets/components/iron-icons/communication-icons.html +59 -0
- data/app/assets/components/iron-icons/device-icons.html +94 -0
- data/app/assets/components/iron-icons/editor-icons.html +70 -0
- data/app/assets/components/iron-icons/hardware-icons.html +61 -0
- data/app/assets/components/iron-icons/hero.svg +35 -0
- data/app/assets/components/iron-icons/image-icons.html +164 -0
- data/app/assets/components/iron-icons/iron-icons.html +303 -0
- data/app/assets/components/iron-icons/maps-icons.html +71 -0
- data/app/assets/components/iron-icons/notification-icons.html +62 -0
- data/app/assets/components/iron-icons/social-icons.html +40 -0
- data/app/assets/components/iron-iconset-svg/iron-iconset-svg.html +191 -0
- data/app/assets/components/iron-input/hero.svg +19 -0
- data/app/assets/components/iron-input/iron-input.html +235 -0
- data/app/assets/components/iron-media-query/hero.svg +29 -0
- data/app/assets/components/iron-media-query/iron-media-query.html +84 -0
- data/app/assets/components/iron-menu-behavior/iron-menu-behavior.html +214 -0
- data/app/assets/components/iron-menu-behavior/iron-menubar-behavior.html +65 -0
- data/app/assets/components/iron-meta/hero.svg +33 -0
- data/app/assets/components/iron-meta/iron-meta.html +352 -0
- data/app/assets/components/iron-overlay-behavior/iron-overlay-backdrop.html +132 -0
- data/app/assets/components/iron-overlay-behavior/iron-overlay-behavior.html +432 -0
- data/app/assets/components/iron-overlay-behavior/iron-overlay-manager.html +107 -0
- data/app/assets/components/iron-range-behavior/iron-range-behavior.html +101 -0
- data/app/assets/components/iron-resizable-behavior/iron-resizable-behavior.html +139 -0
- data/app/assets/components/iron-selector/iron-multi-selectable.html +120 -0
- data/app/assets/components/iron-selector/iron-selectable.html +307 -0
- data/app/assets/components/iron-selector/iron-selection.html +115 -0
- data/app/assets/components/iron-selector/iron-selector.html +71 -0
- data/app/assets/components/iron-validatable-behavior/iron-validatable-behavior.html +100 -0
- data/app/assets/components/neon-animation/animations/cascaded-animation.html +84 -0
- data/app/assets/components/neon-animation/animations/fade-in-animation.html +49 -0
- data/app/assets/components/neon-animation/animations/fade-out-animation.html +49 -0
- data/app/assets/components/neon-animation/animations/hero-animation.html +83 -0
- data/app/assets/components/neon-animation/animations/opaque-animation.html +46 -0
- data/app/assets/components/neon-animation/animations/ripple-animation.html +92 -0
- data/app/assets/components/neon-animation/animations/scale-down-animation.html +65 -0
- data/app/assets/components/neon-animation/animations/scale-up-animation.html +58 -0
- data/app/assets/components/neon-animation/animations/slide-down-animation.html +59 -0
- data/app/assets/components/neon-animation/animations/slide-from-left-animation.html +60 -0
- data/app/assets/components/neon-animation/animations/slide-from-right-animation.html +60 -0
- data/app/assets/components/neon-animation/animations/slide-left-animation.html +59 -0
- data/app/assets/components/neon-animation/animations/slide-right-animation.html +59 -0
- data/app/assets/components/neon-animation/animations/slide-up-animation.html +59 -0
- data/app/assets/components/neon-animation/animations/transform-animation.html +61 -0
- data/app/assets/components/neon-animation/guides/neon-animation.md +313 -0
- data/app/assets/components/neon-animation/neon-animatable-behavior.html +156 -0
- data/app/assets/components/neon-animation/neon-animatable.html +54 -0
- data/app/assets/components/neon-animation/neon-animated-pages.html +208 -0
- data/app/assets/components/neon-animation/neon-animation-behavior.html +88 -0
- data/app/assets/components/neon-animation/neon-animation-runner-behavior.html +110 -0
- data/app/assets/components/neon-animation/neon-animation.html +17 -0
- data/app/assets/components/neon-animation/neon-animations.html +25 -0
- data/app/assets/components/neon-animation/neon-shared-element-animatable-behavior.html +37 -0
- data/app/assets/components/neon-animation/neon-shared-element-animation-behavior.html +66 -0
- data/app/assets/components/neon-animation/web-animations.html +11 -0
- data/app/assets/components/paper-behaviors/paper-button-behavior.html +55 -0
- data/app/assets/components/paper-behaviors/paper-inky-focus-behavior.html +44 -0
- data/app/assets/components/paper-button/paper-button.html +177 -0
- data/app/assets/components/paper-checkbox/metadata.html +17 -0
- data/app/assets/components/paper-checkbox/paper-checkbox.css +149 -0
- data/app/assets/components/paper-checkbox/paper-checkbox.html +163 -0
- data/app/assets/components/paper-dialog-behavior/hero.svg +51 -0
- data/app/assets/components/paper-dialog-behavior/paper-dialog-behavior.html +236 -0
- data/app/assets/components/paper-dialog-behavior/paper-dialog-common.css +58 -0
- data/app/assets/components/paper-dialog-scrollable/hero.svg +69 -0
- data/app/assets/components/paper-dialog-scrollable/paper-dialog-scrollable.html +150 -0
- data/app/assets/components/paper-dialog/hero.svg +58 -0
- data/app/assets/components/paper-dialog/paper-dialog.html +122 -0
- data/app/assets/components/paper-drawer-panel/hero.svg +21 -0
- data/app/assets/components/paper-drawer-panel/paper-drawer-panel.css +142 -0
- data/app/assets/components/paper-drawer-panel/paper-drawer-panel.html +585 -0
- data/app/assets/components/paper-fab/paper-fab.html +159 -0
- data/app/assets/components/paper-header-panel/hero.svg +38 -0
- data/app/assets/components/paper-header-panel/paper-header-panel.html +496 -0
- data/app/assets/components/paper-icon-button/paper-icon-button.html +141 -0
- data/app/assets/components/paper-input/all-imports.html +12 -0
- data/app/assets/components/paper-input/hero.svg +19 -0
- data/app/assets/components/paper-input/paper-input-addon-behavior.html +43 -0
- data/app/assets/components/paper-input/paper-input-behavior.html +293 -0
- data/app/assets/components/paper-input/paper-input-char-counter.html +95 -0
- data/app/assets/components/paper-input/paper-input-container.html +495 -0
- data/app/assets/components/paper-input/paper-input-error.html +99 -0
- data/app/assets/components/paper-input/paper-input.html +126 -0
- data/app/assets/components/paper-input/paper-textarea.html +100 -0
- data/app/assets/components/paper-item/all-imports.html +13 -0
- data/app/assets/components/paper-item/paper-icon-item.html +86 -0
- data/app/assets/components/paper-item/paper-item-body.html +93 -0
- data/app/assets/components/paper-item/paper-item-shared.css +19 -0
- data/app/assets/components/paper-item/paper-item.html +95 -0
- data/app/assets/components/paper-material/paper-material.html +98 -0
- data/app/assets/components/paper-menu/hero.svg +35 -0
- data/app/assets/components/paper-menu/paper-menu.html +133 -0
- data/app/assets/components/paper-progress/hero.svg +21 -0
- data/app/assets/components/paper-progress/paper-progress.html +199 -0
- data/app/assets/components/paper-radio-button/hero.svg +22 -0
- data/app/assets/components/paper-radio-button/paper-radio-button.css +109 -0
- data/app/assets/components/paper-radio-button/paper-radio-button.html +148 -0
- data/app/assets/components/paper-radio-group/hero.svg +25 -0
- data/app/assets/components/paper-radio-group/paper-radio-group.html +186 -0
- data/app/assets/components/paper-ripple/hero.svg +30 -0
- data/app/assets/components/paper-ripple/paper-ripple.html +714 -0
- data/app/assets/components/paper-scroll-header-panel/hero.svg +41 -0
- data/app/assets/components/paper-scroll-header-panel/paper-scroll-header-panel.html +455 -0
- data/app/assets/components/paper-slider/hero.svg +20 -0
- data/app/assets/components/paper-slider/paper-slider.css +252 -0
- data/app/assets/components/paper-slider/paper-slider.html +449 -0
- data/app/assets/components/paper-spinner/hero.svg +27 -0
- data/app/assets/components/paper-spinner/paper-spinner.css +325 -0
- data/app/assets/components/paper-spinner/paper-spinner.html +222 -0
- data/app/assets/components/paper-styles/classes/global.html +96 -0
- data/app/assets/components/paper-styles/classes/shadow-layout.html +302 -0
- data/app/assets/components/paper-styles/classes/shadow.html +39 -0
- data/app/assets/components/paper-styles/classes/typography.html +171 -0
- data/app/assets/components/paper-styles/color.html +333 -0
- data/app/assets/components/paper-styles/default-theme.html +39 -0
- data/app/assets/components/paper-styles/paper-styles-classes.html +14 -0
- data/app/assets/components/paper-styles/paper-styles.html +17 -0
- data/app/assets/components/paper-styles/shadow.html +61 -0
- data/app/assets/components/paper-styles/typography.html +240 -0
- data/app/assets/components/paper-tabs/hero.svg +23 -0
- data/app/assets/components/paper-tabs/paper-tab.html +158 -0
- data/app/assets/components/paper-tabs/paper-tabs-icons.html +18 -0
- data/app/assets/components/paper-tabs/paper-tabs.html +483 -0
- data/app/assets/components/paper-toast/hero.svg +20 -0
- data/app/assets/components/paper-toast/paper-toast.html +164 -0
- data/app/assets/components/paper-toggle-button/hero.svg +22 -0
- data/app/assets/components/paper-toggle-button/paper-toggle-button.css +108 -0
- data/app/assets/components/paper-toggle-button/paper-toggle-button.html +183 -0
- data/app/assets/components/paper-toolbar/paper-toolbar.html +375 -0
- data/app/assets/components/polymer-gestures/Gruntfile.js +60 -0
- data/app/assets/components/polymer-gestures/banner.txt +9 -0
- data/app/assets/components/polymer-gestures/build.json +17 -0
- data/app/assets/components/polymer-gestures/conf/karma.conf.js +39 -0
- data/app/assets/components/polymer-gestures/package.json +20 -0
- data/app/assets/components/polymer-gestures/polymer-gestures.html +21 -0
- data/app/assets/components/polymer-gestures/polymer-gestures.js +46 -0
- data/app/assets/components/polymer-gestures/src/dispatcher.js +474 -0
- data/app/assets/components/polymer-gestures/src/eventFactory.js +127 -0
- data/app/assets/components/polymer-gestures/src/hold.js +129 -0
- data/app/assets/components/polymer-gestures/src/mouse.js +135 -0
- data/app/assets/components/polymer-gestures/src/ms.js +80 -0
- data/app/assets/components/polymer-gestures/src/pinch.js +186 -0
- data/app/assets/components/polymer-gestures/src/platform-events.js +39 -0
- data/app/assets/components/polymer-gestures/src/pointer.js +68 -0
- data/app/assets/components/polymer-gestures/src/pointermap.js +67 -0
- data/app/assets/components/polymer-gestures/src/scope.js +10 -0
- data/app/assets/components/polymer-gestures/src/tap.js +103 -0
- data/app/assets/components/polymer-gestures/src/targetfind.js +244 -0
- data/app/assets/components/polymer-gestures/src/touch-action.js +60 -0
- data/app/assets/components/polymer-gestures/src/touch.js +341 -0
- data/app/assets/components/polymer-gestures/src/track.js +230 -0
- data/app/assets/components/web-animations-js/web-animations-next-lite.min.js +17 -0
- data/app/assets/components/web-animations-js/web-animations-next.min.js +17 -0
- data/app/assets/components/web-animations-js/web-animations.min.js +17 -0
- data/app/assets/components/webcomponentsjs/CustomElements.js +956 -0
- data/app/assets/components/webcomponentsjs/CustomElements.min.js +11 -0
- data/app/assets/components/webcomponentsjs/HTMLImports.js +1078 -0
- data/app/assets/components/webcomponentsjs/HTMLImports.min.js +11 -0
- data/app/assets/components/webcomponentsjs/MutationObserver.js +344 -0
- data/app/assets/components/webcomponentsjs/MutationObserver.min.js +11 -0
- data/app/assets/components/webcomponentsjs/ShadowDOM.js +4414 -0
- data/app/assets/components/webcomponentsjs/ShadowDOM.min.js +15 -0
- data/app/assets/components/webcomponentsjs/package.json +31 -0
- data/app/assets/components/webcomponentsjs/webcomponents-lite.js +2300 -0
- data/app/assets/components/webcomponentsjs/webcomponents-lite.min.js +13 -0
- data/app/assets/components/webcomponentsjs/webcomponents.js +7112 -0
- data/app/assets/components/webcomponentsjs/webcomponents.min.js +15 -0
- data/lib/polymer-paper-elements-rails.rb +2 -0
- data/lib/polymer-paper-elements-rails/engine.rb +4 -0
- data/lib/polymer-paper-elements-rails/version.rb +3 -0
- metadata +272 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
|
3
|
+
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
|
4
|
+
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
|
5
|
+
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
|
6
|
+
* Code distributed by Google as part of the polymer project is also
|
|
7
|
+
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
(function(scope) {
|
|
11
|
+
var hasFullPath = false;
|
|
12
|
+
|
|
13
|
+
// test for full event path support
|
|
14
|
+
var pathTest = document.createElement('meta');
|
|
15
|
+
if (pathTest.createShadowRoot) {
|
|
16
|
+
var sr = pathTest.createShadowRoot();
|
|
17
|
+
var s = document.createElement('span');
|
|
18
|
+
sr.appendChild(s);
|
|
19
|
+
pathTest.addEventListener('testpath', function(ev) {
|
|
20
|
+
if (ev.path) {
|
|
21
|
+
// if the span is in the event path, then path[0] is the real source for all events
|
|
22
|
+
hasFullPath = ev.path[0] === s;
|
|
23
|
+
}
|
|
24
|
+
ev.stopPropagation();
|
|
25
|
+
});
|
|
26
|
+
var ev = new CustomEvent('testpath', {bubbles: true});
|
|
27
|
+
// must add node to DOM to trigger event listener
|
|
28
|
+
document.head.appendChild(pathTest);
|
|
29
|
+
s.dispatchEvent(ev);
|
|
30
|
+
pathTest.parentNode.removeChild(pathTest);
|
|
31
|
+
sr = s = null;
|
|
32
|
+
}
|
|
33
|
+
pathTest = null;
|
|
34
|
+
|
|
35
|
+
var target = {
|
|
36
|
+
shadow: function(inEl) {
|
|
37
|
+
if (inEl) {
|
|
38
|
+
return inEl.shadowRoot || inEl.webkitShadowRoot;
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
canTarget: function(shadow) {
|
|
42
|
+
return shadow && Boolean(shadow.elementFromPoint);
|
|
43
|
+
},
|
|
44
|
+
targetingShadow: function(inEl) {
|
|
45
|
+
var s = this.shadow(inEl);
|
|
46
|
+
if (this.canTarget(s)) {
|
|
47
|
+
return s;
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
olderShadow: function(shadow) {
|
|
51
|
+
var os = shadow.olderShadowRoot;
|
|
52
|
+
if (!os) {
|
|
53
|
+
var se = shadow.querySelector('shadow');
|
|
54
|
+
if (se) {
|
|
55
|
+
os = se.olderShadowRoot;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return os;
|
|
59
|
+
},
|
|
60
|
+
allShadows: function(element) {
|
|
61
|
+
var shadows = [], s = this.shadow(element);
|
|
62
|
+
while(s) {
|
|
63
|
+
shadows.push(s);
|
|
64
|
+
s = this.olderShadow(s);
|
|
65
|
+
}
|
|
66
|
+
return shadows;
|
|
67
|
+
},
|
|
68
|
+
searchRoot: function(inRoot, x, y) {
|
|
69
|
+
var t, st, sr, os;
|
|
70
|
+
if (inRoot) {
|
|
71
|
+
t = inRoot.elementFromPoint(x, y);
|
|
72
|
+
if (t) {
|
|
73
|
+
// found element, check if it has a ShadowRoot
|
|
74
|
+
sr = this.targetingShadow(t);
|
|
75
|
+
} else if (inRoot !== document) {
|
|
76
|
+
// check for sibling roots
|
|
77
|
+
sr = this.olderShadow(inRoot);
|
|
78
|
+
}
|
|
79
|
+
// search other roots, fall back to light dom element
|
|
80
|
+
return this.searchRoot(sr, x, y) || t;
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
owner: function(element) {
|
|
84
|
+
if (!element) {
|
|
85
|
+
return document;
|
|
86
|
+
}
|
|
87
|
+
var s = element;
|
|
88
|
+
// walk up until you hit the shadow root or document
|
|
89
|
+
while (s.parentNode) {
|
|
90
|
+
s = s.parentNode;
|
|
91
|
+
}
|
|
92
|
+
// the owner element is expected to be a Document or ShadowRoot
|
|
93
|
+
if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {
|
|
94
|
+
s = document;
|
|
95
|
+
}
|
|
96
|
+
return s;
|
|
97
|
+
},
|
|
98
|
+
findTarget: function(inEvent) {
|
|
99
|
+
if (hasFullPath && inEvent.path && inEvent.path.length) {
|
|
100
|
+
return inEvent.path[0];
|
|
101
|
+
}
|
|
102
|
+
var x = inEvent.clientX, y = inEvent.clientY;
|
|
103
|
+
// if the listener is in the shadow root, it is much faster to start there
|
|
104
|
+
var s = this.owner(inEvent.target);
|
|
105
|
+
// if x, y is not in this root, fall back to document search
|
|
106
|
+
if (!s.elementFromPoint(x, y)) {
|
|
107
|
+
s = document;
|
|
108
|
+
}
|
|
109
|
+
return this.searchRoot(s, x, y);
|
|
110
|
+
},
|
|
111
|
+
findTouchAction: function(inEvent) {
|
|
112
|
+
var n;
|
|
113
|
+
if (hasFullPath && inEvent.path && inEvent.path.length) {
|
|
114
|
+
var path = inEvent.path;
|
|
115
|
+
for (var i = 0; i < path.length; i++) {
|
|
116
|
+
n = path[i];
|
|
117
|
+
if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {
|
|
118
|
+
return n.getAttribute('touch-action');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
} else {
|
|
122
|
+
n = inEvent.target;
|
|
123
|
+
while(n) {
|
|
124
|
+
if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {
|
|
125
|
+
return n.getAttribute('touch-action');
|
|
126
|
+
}
|
|
127
|
+
n = n.parentNode || n.host;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// auto is default
|
|
131
|
+
return "auto";
|
|
132
|
+
},
|
|
133
|
+
LCA: function(a, b) {
|
|
134
|
+
if (a === b) {
|
|
135
|
+
return a;
|
|
136
|
+
}
|
|
137
|
+
if (a && !b) {
|
|
138
|
+
return a;
|
|
139
|
+
}
|
|
140
|
+
if (b && !a) {
|
|
141
|
+
return b;
|
|
142
|
+
}
|
|
143
|
+
if (!b && !a) {
|
|
144
|
+
return document;
|
|
145
|
+
}
|
|
146
|
+
// fast case, a is a direct descendant of b or vice versa
|
|
147
|
+
if (a.contains && a.contains(b)) {
|
|
148
|
+
return a;
|
|
149
|
+
}
|
|
150
|
+
if (b.contains && b.contains(a)) {
|
|
151
|
+
return b;
|
|
152
|
+
}
|
|
153
|
+
var adepth = this.depth(a);
|
|
154
|
+
var bdepth = this.depth(b);
|
|
155
|
+
var d = adepth - bdepth;
|
|
156
|
+
if (d >= 0) {
|
|
157
|
+
a = this.walk(a, d);
|
|
158
|
+
} else {
|
|
159
|
+
b = this.walk(b, -d);
|
|
160
|
+
}
|
|
161
|
+
while (a && b && a !== b) {
|
|
162
|
+
a = a.parentNode || a.host;
|
|
163
|
+
b = b.parentNode || b.host;
|
|
164
|
+
}
|
|
165
|
+
return a;
|
|
166
|
+
},
|
|
167
|
+
walk: function(n, u) {
|
|
168
|
+
for (var i = 0; n && (i < u); i++) {
|
|
169
|
+
n = n.parentNode || n.host;
|
|
170
|
+
}
|
|
171
|
+
return n;
|
|
172
|
+
},
|
|
173
|
+
depth: function(n) {
|
|
174
|
+
var d = 0;
|
|
175
|
+
while(n) {
|
|
176
|
+
d++;
|
|
177
|
+
n = n.parentNode || n.host;
|
|
178
|
+
}
|
|
179
|
+
return d;
|
|
180
|
+
},
|
|
181
|
+
deepContains: function(a, b) {
|
|
182
|
+
var common = this.LCA(a, b);
|
|
183
|
+
// if a is the common ancestor, it must "deeply" contain b
|
|
184
|
+
return common === a;
|
|
185
|
+
},
|
|
186
|
+
insideNode: function(node, x, y) {
|
|
187
|
+
var rect = node.getBoundingClientRect();
|
|
188
|
+
return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);
|
|
189
|
+
},
|
|
190
|
+
path: function(event) {
|
|
191
|
+
var p;
|
|
192
|
+
if (hasFullPath && event.path && event.path.length) {
|
|
193
|
+
p = event.path;
|
|
194
|
+
} else {
|
|
195
|
+
p = [];
|
|
196
|
+
var n = this.findTarget(event);
|
|
197
|
+
while (n) {
|
|
198
|
+
p.push(n);
|
|
199
|
+
n = n.parentNode || n.host;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return p;
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
scope.targetFinding = target;
|
|
206
|
+
/**
|
|
207
|
+
* Given an event, finds the "deepest" node that could have been the original target before ShadowDOM retargetting
|
|
208
|
+
*
|
|
209
|
+
* @param {Event} Event An event object with clientX and clientY properties
|
|
210
|
+
* @return {Element} The probable event origninator
|
|
211
|
+
*/
|
|
212
|
+
scope.findTarget = target.findTarget.bind(target);
|
|
213
|
+
/**
|
|
214
|
+
* Determines if the "container" node deeply contains the "containee" node, including situations where the "containee" is contained by one or more ShadowDOM
|
|
215
|
+
* roots.
|
|
216
|
+
*
|
|
217
|
+
* @param {Node} container
|
|
218
|
+
* @param {Node} containee
|
|
219
|
+
* @return {Boolean}
|
|
220
|
+
*/
|
|
221
|
+
scope.deepContains = target.deepContains.bind(target);
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Determines if the x/y position is inside the given node.
|
|
225
|
+
*
|
|
226
|
+
* Example:
|
|
227
|
+
*
|
|
228
|
+
* function upHandler(event) {
|
|
229
|
+
* var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);
|
|
230
|
+
* if (innode) {
|
|
231
|
+
* // wait for tap?
|
|
232
|
+
* } else {
|
|
233
|
+
* // tap will never happen
|
|
234
|
+
* }
|
|
235
|
+
* }
|
|
236
|
+
*
|
|
237
|
+
* @param {Node} node
|
|
238
|
+
* @param {Number} x Screen X position
|
|
239
|
+
* @param {Number} y screen Y position
|
|
240
|
+
* @return {Boolean}
|
|
241
|
+
*/
|
|
242
|
+
scope.insideNode = target.insideNode;
|
|
243
|
+
|
|
244
|
+
})(window.PolymerGestures);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
|
4
|
+
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
|
5
|
+
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
|
6
|
+
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
|
7
|
+
* Code distributed by Google as part of the polymer project is also
|
|
8
|
+
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
(function() {
|
|
12
|
+
function shadowSelector(v) {
|
|
13
|
+
return 'html /deep/ ' + selector(v);
|
|
14
|
+
}
|
|
15
|
+
function selector(v) {
|
|
16
|
+
return '[touch-action="' + v + '"]';
|
|
17
|
+
}
|
|
18
|
+
function rule(v) {
|
|
19
|
+
return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';
|
|
20
|
+
}
|
|
21
|
+
var attrib2css = [
|
|
22
|
+
'none',
|
|
23
|
+
'auto',
|
|
24
|
+
'pan-x',
|
|
25
|
+
'pan-y',
|
|
26
|
+
{
|
|
27
|
+
rule: 'pan-x pan-y',
|
|
28
|
+
selectors: [
|
|
29
|
+
'pan-x pan-y',
|
|
30
|
+
'pan-y pan-x'
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
'manipulation'
|
|
34
|
+
];
|
|
35
|
+
var styles = '';
|
|
36
|
+
// only install stylesheet if the browser has touch action support
|
|
37
|
+
var hasTouchAction = typeof document.head.style.touchAction === 'string';
|
|
38
|
+
// only add shadow selectors if shadowdom is supported
|
|
39
|
+
var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;
|
|
40
|
+
|
|
41
|
+
if (hasTouchAction) {
|
|
42
|
+
attrib2css.forEach(function(r) {
|
|
43
|
+
if (String(r) === r) {
|
|
44
|
+
styles += selector(r) + rule(r) + '\n';
|
|
45
|
+
if (hasShadowRoot) {
|
|
46
|
+
styles += shadowSelector(r) + rule(r) + '\n';
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
styles += r.selectors.map(selector) + rule(r.rule) + '\n';
|
|
50
|
+
if (hasShadowRoot) {
|
|
51
|
+
styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\n';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
var el = document.createElement('style');
|
|
57
|
+
el.textContent = styles;
|
|
58
|
+
document.head.appendChild(el);
|
|
59
|
+
}
|
|
60
|
+
})();
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
|
3
|
+
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
|
4
|
+
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
|
5
|
+
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
|
6
|
+
* Code distributed by Google as part of the polymer project is also
|
|
7
|
+
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
(function(scope) {
|
|
11
|
+
var dispatcher = scope.dispatcher;
|
|
12
|
+
var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);
|
|
13
|
+
var pointermap = dispatcher.pointermap;
|
|
14
|
+
var touchMap = Array.prototype.map.call.bind(Array.prototype.map);
|
|
15
|
+
// This should be long enough to ignore compat mouse events made by touch
|
|
16
|
+
var DEDUP_TIMEOUT = 2500;
|
|
17
|
+
var DEDUP_DIST = 25;
|
|
18
|
+
var CLICK_COUNT_TIMEOUT = 200;
|
|
19
|
+
var HYSTERESIS = 20;
|
|
20
|
+
var ATTRIB = 'touch-action';
|
|
21
|
+
// TODO(dfreedm): disable until http://crbug.com/399765 is resolved
|
|
22
|
+
// var HAS_TOUCH_ACTION = ATTRIB in document.head.style;
|
|
23
|
+
var HAS_TOUCH_ACTION = false;
|
|
24
|
+
|
|
25
|
+
// handler block for native touch events
|
|
26
|
+
var touchEvents = {
|
|
27
|
+
IS_IOS: false,
|
|
28
|
+
events: [
|
|
29
|
+
'touchstart',
|
|
30
|
+
'touchmove',
|
|
31
|
+
'touchend',
|
|
32
|
+
'touchcancel'
|
|
33
|
+
],
|
|
34
|
+
exposes: [
|
|
35
|
+
'down',
|
|
36
|
+
'up',
|
|
37
|
+
'move'
|
|
38
|
+
],
|
|
39
|
+
register: function(target, initial) {
|
|
40
|
+
if (this.IS_IOS ? initial : !initial) {
|
|
41
|
+
dispatcher.listen(target, this.events);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
unregister: function(target) {
|
|
45
|
+
if (!this.IS_IOS) {
|
|
46
|
+
dispatcher.unlisten(target, this.events);
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
scrollTypes: {
|
|
50
|
+
EMITTER: 'none',
|
|
51
|
+
XSCROLLER: 'pan-x',
|
|
52
|
+
YSCROLLER: 'pan-y',
|
|
53
|
+
},
|
|
54
|
+
touchActionToScrollType: function(touchAction) {
|
|
55
|
+
var t = touchAction;
|
|
56
|
+
var st = this.scrollTypes;
|
|
57
|
+
if (t === st.EMITTER) {
|
|
58
|
+
return 'none';
|
|
59
|
+
} else if (t === st.XSCROLLER) {
|
|
60
|
+
return 'X';
|
|
61
|
+
} else if (t === st.YSCROLLER) {
|
|
62
|
+
return 'Y';
|
|
63
|
+
} else {
|
|
64
|
+
return 'XY';
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
POINTER_TYPE: 'touch',
|
|
68
|
+
firstTouch: null,
|
|
69
|
+
isPrimaryTouch: function(inTouch) {
|
|
70
|
+
return this.firstTouch === inTouch.identifier;
|
|
71
|
+
},
|
|
72
|
+
setPrimaryTouch: function(inTouch) {
|
|
73
|
+
// set primary touch if there no pointers, or the only pointer is the mouse
|
|
74
|
+
if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {
|
|
75
|
+
this.firstTouch = inTouch.identifier;
|
|
76
|
+
this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};
|
|
77
|
+
this.firstTarget = inTouch.target;
|
|
78
|
+
this.scrolling = null;
|
|
79
|
+
this.cancelResetClickCount();
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
removePrimaryPointer: function(inPointer) {
|
|
83
|
+
if (inPointer.isPrimary) {
|
|
84
|
+
this.firstTouch = null;
|
|
85
|
+
this.firstXY = null;
|
|
86
|
+
this.resetClickCount();
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
clickCount: 0,
|
|
90
|
+
resetId: null,
|
|
91
|
+
resetClickCount: function() {
|
|
92
|
+
var fn = function() {
|
|
93
|
+
this.clickCount = 0;
|
|
94
|
+
this.resetId = null;
|
|
95
|
+
}.bind(this);
|
|
96
|
+
this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);
|
|
97
|
+
},
|
|
98
|
+
cancelResetClickCount: function() {
|
|
99
|
+
if (this.resetId) {
|
|
100
|
+
clearTimeout(this.resetId);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
typeToButtons: function(type) {
|
|
104
|
+
var ret = 0;
|
|
105
|
+
if (type === 'touchstart' || type === 'touchmove') {
|
|
106
|
+
ret = 1;
|
|
107
|
+
}
|
|
108
|
+
return ret;
|
|
109
|
+
},
|
|
110
|
+
findTarget: function(touch, id) {
|
|
111
|
+
if (this.currentTouchEvent.type === 'touchstart') {
|
|
112
|
+
if (this.isPrimaryTouch(touch)) {
|
|
113
|
+
var fastPath = {
|
|
114
|
+
clientX: touch.clientX,
|
|
115
|
+
clientY: touch.clientY,
|
|
116
|
+
path: this.currentTouchEvent.path,
|
|
117
|
+
target: this.currentTouchEvent.target
|
|
118
|
+
};
|
|
119
|
+
return scope.findTarget(fastPath);
|
|
120
|
+
} else {
|
|
121
|
+
return scope.findTarget(touch);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// reuse target we found in touchstart
|
|
125
|
+
return pointermap.get(id);
|
|
126
|
+
},
|
|
127
|
+
touchToPointer: function(inTouch) {
|
|
128
|
+
var cte = this.currentTouchEvent;
|
|
129
|
+
var e = dispatcher.cloneEvent(inTouch);
|
|
130
|
+
// Spec specifies that pointerId 1 is reserved for Mouse.
|
|
131
|
+
// Touch identifiers can start at 0.
|
|
132
|
+
// Add 2 to the touch identifier for compatibility.
|
|
133
|
+
var id = e.pointerId = inTouch.identifier + 2;
|
|
134
|
+
e.target = this.findTarget(inTouch, id);
|
|
135
|
+
e.bubbles = true;
|
|
136
|
+
e.cancelable = true;
|
|
137
|
+
e.detail = this.clickCount;
|
|
138
|
+
e.buttons = this.typeToButtons(cte.type);
|
|
139
|
+
e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;
|
|
140
|
+
e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;
|
|
141
|
+
e.pressure = inTouch.webkitForce || inTouch.force || 0.5;
|
|
142
|
+
e.isPrimary = this.isPrimaryTouch(inTouch);
|
|
143
|
+
e.pointerType = this.POINTER_TYPE;
|
|
144
|
+
e._source = 'touch';
|
|
145
|
+
// forward touch preventDefaults
|
|
146
|
+
var self = this;
|
|
147
|
+
e.preventDefault = function() {
|
|
148
|
+
self.scrolling = false;
|
|
149
|
+
self.firstXY = null;
|
|
150
|
+
cte.preventDefault();
|
|
151
|
+
};
|
|
152
|
+
return e;
|
|
153
|
+
},
|
|
154
|
+
processTouches: function(inEvent, inFunction) {
|
|
155
|
+
var tl = inEvent.changedTouches;
|
|
156
|
+
this.currentTouchEvent = inEvent;
|
|
157
|
+
for (var i = 0, t, p; i < tl.length; i++) {
|
|
158
|
+
t = tl[i];
|
|
159
|
+
p = this.touchToPointer(t);
|
|
160
|
+
if (inEvent.type === 'touchstart') {
|
|
161
|
+
pointermap.set(p.pointerId, p.target);
|
|
162
|
+
}
|
|
163
|
+
if (pointermap.has(p.pointerId)) {
|
|
164
|
+
inFunction.call(this, p);
|
|
165
|
+
}
|
|
166
|
+
if (inEvent.type === 'touchend' || inEvent._cancel) {
|
|
167
|
+
this.cleanUpPointer(p);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
// For single axis scrollers, determines whether the element should emit
|
|
172
|
+
// pointer events or behave as a scroller
|
|
173
|
+
shouldScroll: function(inEvent) {
|
|
174
|
+
if (this.firstXY) {
|
|
175
|
+
var ret;
|
|
176
|
+
var touchAction = scope.targetFinding.findTouchAction(inEvent);
|
|
177
|
+
var scrollAxis = this.touchActionToScrollType(touchAction);
|
|
178
|
+
if (scrollAxis === 'none') {
|
|
179
|
+
// this element is a touch-action: none, should never scroll
|
|
180
|
+
ret = false;
|
|
181
|
+
} else if (scrollAxis === 'XY') {
|
|
182
|
+
// this element should always scroll
|
|
183
|
+
ret = true;
|
|
184
|
+
} else {
|
|
185
|
+
var t = inEvent.changedTouches[0];
|
|
186
|
+
// check the intended scroll axis, and other axis
|
|
187
|
+
var a = scrollAxis;
|
|
188
|
+
var oa = scrollAxis === 'Y' ? 'X' : 'Y';
|
|
189
|
+
var da = Math.abs(t['client' + a] - this.firstXY[a]);
|
|
190
|
+
var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);
|
|
191
|
+
// if delta in the scroll axis > delta other axis, scroll instead of
|
|
192
|
+
// making events
|
|
193
|
+
ret = da >= doa;
|
|
194
|
+
}
|
|
195
|
+
return ret;
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
findTouch: function(inTL, inId) {
|
|
199
|
+
for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {
|
|
200
|
+
if (t.identifier === inId) {
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
// In some instances, a touchstart can happen without a touchend. This
|
|
206
|
+
// leaves the pointermap in a broken state.
|
|
207
|
+
// Therefore, on every touchstart, we remove the touches that did not fire a
|
|
208
|
+
// touchend event.
|
|
209
|
+
// To keep state globally consistent, we fire a
|
|
210
|
+
// pointercancel for this "abandoned" touch
|
|
211
|
+
vacuumTouches: function(inEvent) {
|
|
212
|
+
var tl = inEvent.touches;
|
|
213
|
+
// pointermap.pointers() should be < tl.length here, as the touchstart has not
|
|
214
|
+
// been processed yet.
|
|
215
|
+
if (pointermap.pointers() >= tl.length) {
|
|
216
|
+
var d = [];
|
|
217
|
+
pointermap.forEach(function(value, key) {
|
|
218
|
+
// Never remove pointerId == 1, which is mouse.
|
|
219
|
+
// Touch identifiers are 2 smaller than their pointerId, which is the
|
|
220
|
+
// index in pointermap.
|
|
221
|
+
if (key !== 1 && !this.findTouch(tl, key - 2)) {
|
|
222
|
+
var p = value;
|
|
223
|
+
d.push(p);
|
|
224
|
+
}
|
|
225
|
+
}, this);
|
|
226
|
+
d.forEach(function(p) {
|
|
227
|
+
this.cancel(p);
|
|
228
|
+
pointermap.delete(p.pointerId);
|
|
229
|
+
}, this);
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
touchstart: function(inEvent) {
|
|
233
|
+
this.vacuumTouches(inEvent);
|
|
234
|
+
this.setPrimaryTouch(inEvent.changedTouches[0]);
|
|
235
|
+
this.dedupSynthMouse(inEvent);
|
|
236
|
+
if (!this.scrolling) {
|
|
237
|
+
this.clickCount++;
|
|
238
|
+
this.processTouches(inEvent, this.down);
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
down: function(inPointer) {
|
|
242
|
+
dispatcher.down(inPointer);
|
|
243
|
+
},
|
|
244
|
+
touchmove: function(inEvent) {
|
|
245
|
+
if (HAS_TOUCH_ACTION) {
|
|
246
|
+
// touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36
|
|
247
|
+
// https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ
|
|
248
|
+
if (inEvent.cancelable) {
|
|
249
|
+
this.processTouches(inEvent, this.move);
|
|
250
|
+
}
|
|
251
|
+
} else {
|
|
252
|
+
if (!this.scrolling) {
|
|
253
|
+
if (this.scrolling === null && this.shouldScroll(inEvent)) {
|
|
254
|
+
this.scrolling = true;
|
|
255
|
+
} else {
|
|
256
|
+
this.scrolling = false;
|
|
257
|
+
inEvent.preventDefault();
|
|
258
|
+
this.processTouches(inEvent, this.move);
|
|
259
|
+
}
|
|
260
|
+
} else if (this.firstXY) {
|
|
261
|
+
var t = inEvent.changedTouches[0];
|
|
262
|
+
var dx = t.clientX - this.firstXY.X;
|
|
263
|
+
var dy = t.clientY - this.firstXY.Y;
|
|
264
|
+
var dd = Math.sqrt(dx * dx + dy * dy);
|
|
265
|
+
if (dd >= HYSTERESIS) {
|
|
266
|
+
this.touchcancel(inEvent);
|
|
267
|
+
this.scrolling = true;
|
|
268
|
+
this.firstXY = null;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
move: function(inPointer) {
|
|
274
|
+
dispatcher.move(inPointer);
|
|
275
|
+
},
|
|
276
|
+
touchend: function(inEvent) {
|
|
277
|
+
this.dedupSynthMouse(inEvent);
|
|
278
|
+
this.processTouches(inEvent, this.up);
|
|
279
|
+
},
|
|
280
|
+
up: function(inPointer) {
|
|
281
|
+
inPointer.relatedTarget = scope.findTarget(inPointer);
|
|
282
|
+
dispatcher.up(inPointer);
|
|
283
|
+
},
|
|
284
|
+
cancel: function(inPointer) {
|
|
285
|
+
dispatcher.cancel(inPointer);
|
|
286
|
+
},
|
|
287
|
+
touchcancel: function(inEvent) {
|
|
288
|
+
inEvent._cancel = true;
|
|
289
|
+
this.processTouches(inEvent, this.cancel);
|
|
290
|
+
},
|
|
291
|
+
cleanUpPointer: function(inPointer) {
|
|
292
|
+
pointermap['delete'](inPointer.pointerId);
|
|
293
|
+
this.removePrimaryPointer(inPointer);
|
|
294
|
+
},
|
|
295
|
+
// prevent synth mouse events from creating pointer events
|
|
296
|
+
dedupSynthMouse: function(inEvent) {
|
|
297
|
+
var lts = scope.mouseEvents.lastTouches;
|
|
298
|
+
var t = inEvent.changedTouches[0];
|
|
299
|
+
// only the primary finger will synth mouse events
|
|
300
|
+
if (this.isPrimaryTouch(t)) {
|
|
301
|
+
// remember x/y of last touch
|
|
302
|
+
var lt = {x: t.clientX, y: t.clientY};
|
|
303
|
+
lts.push(lt);
|
|
304
|
+
var fn = (function(lts, lt){
|
|
305
|
+
var i = lts.indexOf(lt);
|
|
306
|
+
if (i > -1) {
|
|
307
|
+
lts.splice(i, 1);
|
|
308
|
+
}
|
|
309
|
+
}).bind(null, lts, lt);
|
|
310
|
+
setTimeout(fn, DEDUP_TIMEOUT);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
// prevent "ghost clicks" that come from elements that were removed in a touch handler
|
|
316
|
+
var STOP_PROP_FN = Event.prototype.stopImmediatePropagation || Event.prototype.stopPropagation;
|
|
317
|
+
document.addEventListener('click', function(ev) {
|
|
318
|
+
var x = ev.clientX, y = ev.clientY;
|
|
319
|
+
// check if a click is within DEDUP_DIST px radius of the touchstart
|
|
320
|
+
var closeTo = function(touch) {
|
|
321
|
+
var dx = Math.abs(x - touch.x), dy = Math.abs(y - touch.y);
|
|
322
|
+
return (dx <= DEDUP_DIST && dy <= DEDUP_DIST);
|
|
323
|
+
};
|
|
324
|
+
// if click coordinates are close to touch coordinates, assume the click came from a touch
|
|
325
|
+
var wasTouched = scope.mouseEvents.lastTouches.some(closeTo);
|
|
326
|
+
// if the click came from touch, and the touchstart target is not in the path of the click event,
|
|
327
|
+
// then the touchstart target was probably removed, and the click should be "busted"
|
|
328
|
+
var path = scope.targetFinding.path(ev);
|
|
329
|
+
if (wasTouched) {
|
|
330
|
+
for (var i = 0; i < path.length; i++) {
|
|
331
|
+
if (path[i] === touchEvents.firstTarget) {
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
ev.preventDefault();
|
|
336
|
+
STOP_PROP_FN.call(ev);
|
|
337
|
+
}
|
|
338
|
+
}, true);
|
|
339
|
+
|
|
340
|
+
scope.touchEvents = touchEvents;
|
|
341
|
+
})(window.PolymerGestures);
|