Index: third_party/polymer/components/paper-focusable/paper-focusable.html |
diff --git a/third_party/polymer/components/paper-focusable/paper-focusable.html b/third_party/polymer/components/paper-focusable/paper-focusable.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e478168ddfdd2a4feaf96c5820aeac92f8e0f368 |
--- /dev/null |
+++ b/third_party/polymer/components/paper-focusable/paper-focusable.html |
@@ -0,0 +1,146 @@ |
+<!-- |
+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 |
+--> |
+ |
+<!-- |
+/** |
+ * @group Paper Elements |
+ * |
+ * paper-focusable is a base class for paper elements that can be focused. |
+ * |
+ * @element paper-focusable |
+ * @status beta |
+ * @homepage github.io |
+ */ |
+--> |
+ |
+<link href="../polymer/polymer.html" rel="import"> |
+ |
+<polymer-element name="paper-focusable" attributes="active focused disabled isToggle" tabindex="0" on-down="{{downAction}}" on-up="{{upAction}}" on-focus="{{focusAction}}" on-blur="{{blurAction}}" on-contextmenu="{{contextMenuAction}}"> |
+ |
+ <template> |
+ <style> |
+ :host([disabled]) { |
+ pointer-events: none; |
+ } |
+ </style> |
+ <content></content> |
+ </template> |
+ |
+ <script> |
+ Polymer('paper-focusable', { |
+ |
+ publish: { |
+ |
+ /** |
+ * If true, the button is currently active either because the |
+ * user is holding down the button, or the button is a toggle |
+ * and is currently in the active state. |
+ * |
+ * @attribute active |
+ * @type boolean |
+ * @default false |
+ */ |
+ active: {value: false, reflect: true}, |
+ |
+ /** |
+ * If true, the element currently has focus due to keyboard |
+ * navigation. |
+ * |
+ * @attribute focused |
+ * @type boolean |
+ * @default false |
+ */ |
+ focused: {value: false, reflect: true}, |
+ |
+ /** |
+ * If true, the user is currently holding down the button. |
+ * |
+ * @attribute pressed |
+ * @type boolean |
+ * @default false |
+ */ |
+ pressed: {value: false, reflect: true}, |
+ |
+ /** |
+ * If true, the user cannot interact with this element. |
+ * |
+ * @attribute disabled |
+ * @type boolean |
+ * @default false |
+ */ |
+ disabled: {value: false, reflect: true}, |
+ |
+ /** |
+ * If true, the button toggles the active state with each tap. |
+ * Otherwise, the button becomes active when the user is holding |
+ * it down. |
+ * |
+ * @attribute isToggle |
+ * @type boolean |
+ * @default false |
+ */ |
+ isToggle: {value: false, reflect: false} |
+ |
+ }, |
+ |
+ disabledChanged: function() { |
+ if (this.disabled) { |
+ this.removeAttribute('tabindex'); |
+ } else { |
+ this.setAttribute('tabindex', 0); |
+ } |
+ }, |
+ |
+ downAction: function() { |
+ this.pressed = true; |
+ this.focused = false; |
+ |
+ if (this.isToggle) { |
+ this.active = !this.active; |
+ } else { |
+ this.active = true; |
+ } |
+ }, |
+ |
+ // Pulling up the context menu for an item should focus it; but we need to |
+ // be careful about how we deal with down/up events surrounding context |
+ // menus. The up event typically does not fire until the context menu |
+ // closes: so we focus immediately. |
+ // |
+ // This fires _after_ downAction. |
+ contextMenuAction: function(e) { |
+ // Note that upAction may fire _again_ on the actual up event. |
+ this.upAction(e); |
+ this.focusAction(); |
+ }, |
+ |
+ upAction: function() { |
+ this.pressed = false; |
+ |
+ if (!this.isToggle) { |
+ this.active = false; |
+ } |
+ }, |
+ |
+ focusAction: function() { |
+ if (!this.pressed) { |
+ // Only render the "focused" state if the element gains focus due to |
+ // keyboard navigation. |
+ this.focused = true; |
+ } |
+ }, |
+ |
+ blurAction: function() { |
+ this.focused = false; |
+ } |
+ |
+ }); |
+ |
+ </script> |
+</polymer-element> |