<!-- -- Copyright 2013 The Chromium Authors. All rights reserved. -- Use of this source code is governed by a BSD-style license that can be -- found in the LICENSE file. --> <polymer-element name="kb-key" extends="kb-key-base" attributes="image imageSize keyCode keyName shiftModifier weight"> <template> <style> :host { /* TODO(kevers): A regression in the Polymer library broke * handling of {{}} in CSS rules. Switch back to * "-webkit-box-flex: {{weight}}" once the regression is fixed * (https://github.com/Polymer/polymer/issues/270). */ -webkit-box-flex: 100; background-color: #3b3b3e; /* TODO(rsadam): remove when {{}} regression is fixed */ background-image: none; background-position: center center; background-repeat: no-repeat; /* TODO(rsadam): remove when {{}} regression is fixed */ background-size: 50%; border-top: 2px solid #4b4b4e; border-radius: 2px; color: #ffffff; display: -webkit-box; font-family: 'Open Sans', 'Noto Sans UI', sans-serif; font-weight: 300; margin-left: 0.25em; position: relative; } ::part(key) { bottom: 0; height: 1.2em; left: 0; margin: auto; padding-left: 0.7em; padding-right: 0.7em; position: absolute; right: 0; top: 0; } ::part(hint) { color: #7c7c7c; font-size: 70%; position: absolute; right: 7%; top: 5%; } :host[invert] ::part(key) { color: #7c7c7c; } :host[invert] ::part(hint) { color: #ffffff; } </style> <div id="key" part="key"> <content></content> </div> <div part="hint">{{hintText}}</div> </template> <script> Polymer('kb-key', { /** * The background image to display on this key. Does not display an * image if this is the empty string. * @type {string} */ image: "", /** * The background image size to use if an image is specified. The size * is provided as a string, for example, "50%". * @type {string} */ imageSize: "", /** * Key codes have been deprecated in DOM3 key events, but are required * for legacy web content. The key codes depend on the position of the * key on the keyboard and is independent of which modifier keys (shift, * alt, ...) are active. * @type {number|undefined} */ keyCode: undefined, /** * Name of the key as defined in the DOM3 specification for key events. * Like the keyCode, the keyName is independent of the state of the * modifier keys. * @type {string|undefined} */ keyName: undefined, /** * Whether the shift key is pressed when producing the key value. * @type {boolean} */ shiftModifier: false, /** * Weighting to use for layout in order to properly size the key. * Keys with a high weighting are wider than normal keys. * @type {number} */ weight: 100, /** * Called when the image attribute changes. This is used to set the * background image of the key. * TODO(rsadam): Remove when polymer {{}} syntax regression is fixed. */ imageChanged: function() { if (!this.image) this.style.backgroundImage = "none"; else this.style.backgroundImage = "url(images/" + this.image + ".svg)"; }, /** * Called when the image attribute changes. This is used to set the * background image of the key. * TODO(rsadam): Remove when polymer {{}} syntax regression is fixed. */ imageSizeChanged: function() { this.style.backgroundSize = this.imageSize; }, /** * Returns a subset of the key attributes. * @param {string} caller The id of the function that called * populateDetails. * @return {Object} Mapping of attributes for the key element. */ populateDetails: function(caller) { var details = this.super([caller]); details.keyCode = this.keyCode; details.keyName = this.keyName; details.shiftModifier = this.shiftModifier; return details; }, /** * Adjusts the CSS rules for rendering the key to reflect the new * weight. The preferred way is to use {{weight}} directly in the CSS * rules; however, this is currently broken in the Polymer library. * TODO(kevers): Cleanup once handling of {{}} in CSS rules is fixed. */ weightChanged: function() { if (this.weight > 0) this.style['webkitBoxFlex'] = this.weight; }, }); </script> </polymer-element> <!-- Special keys --> <polymer-element name="kb-abc-key" class="symbol dark" char="Invalid" extends="kb-key" weight="125"> <script> Polymer('kb-abc-key', { populateDetails: function(caller) { var detail = this.super([caller]); switch (caller) { case ('down'): detail.relegateToShift = true; break; default: break; } return detail; } }); </script> </polymer-element> <polymer-element name="kb-hide-keyboard-key" class="hide-keyboard dark" char="Invalid" extends="kb-key"> <script> Polymer('kb-hide-keyboard-key', { /** * Timer for a long press event which triggers the display of a keyboard * options menu. * @type {?Function} */ longPressTimer: undefined, down: function(event) { var self = this; this.longPressTimer = this.asyncMethod(function() { if (self.longPressTimer) { clearTimeout(self.longPressTimer); self.longPressTimer = undefined; var details = { left: this.offsetLeft, top: this.offsetTop, width: this.clientWidth, }; this.fire('show-options', details); } }, null, LONGPRESS_DELAY_MSEC); }, /** @override */ ready: function() { this.super(); this.image = "keyboard"; }, up: function(event) { if (this.longPressTimer) { clearTimeout(this.longPressTimer); hideKeyboard(); this.longPressTimer = undefined; } } }); </script> </polymer-element>