<!-- 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-button` is a button containing text or an image. When the user touches the button, a ripple effect emanates from the point of contact. A `paper-button` may be flat or raised. A raised button behaves like a piece of paper resting on another sheet, and lifts up upon press. Flat buttons do not raise up. Add the `raisedButton` attribute to make a raised button. Example: <paper-button label="flat button"></paper-button> <paper-button label="raised button" raisedButton></paper-button> A button should be styled with a background color, text color, ripple color and hover color. To style the background, text and hover color, apply the `background` and `color` CSS properties to the button. To style the ripple color, apply the `color` CSS property to the `#ripple` element in the button's shadow root: /* Style #my-button blue with white text and darker blue ink. */ #my-button { background: #4285f4; color: #fff; } #my-button:hover { background: #2a56c6; } #my-button::shadow #ripple { color: #2a56c6; } @element paper-button @extends paper-focusable --> <link href="../polymer/polymer.html" rel="import"> <link href="../core-icon/core-icon.html" rel="import"> <link href="../paper-focusable/paper-focusable.html" rel="import"> <link href="../paper-ripple/paper-ripple.html" rel="import"> <link href="../paper-shadow/paper-shadow.html" rel="import"> <polymer-element name="paper-button" extends="paper-focusable" attributes="label raisedButton iconSrc icon" role="button"> <template> <link href="paper-button.css" rel="stylesheet"> <template if="{{raisedButton}}"> <div fit id="shadow-container"> <paper-shadow id="shadow" z="{{z}}" animated></paper-shadow> </div> </template> <div id="clip"> <!-- <div id="focusBg"></div> --> <paper-ripple id="ripple"></paper-ripple> <div id="content"> <template if="{{iconSrc || icon}}"> <core-icon id="icon" src="{{iconSrc}}" icon="{{icon}}"></core-icon> </template> <template if="{{label}}"> <span>{{label}}</span> </template> </div> </div> </template> <script> Polymer('paper-button', { publish: { /** * The label of the button. * * @attribute label * @type string * @default '' */ label: '', /** * If true, the button will be styled as a "raised" button. * * @attribute raisedButton * @type boolean * @default false */ raisedButton: {value: false, reflect: true}, /** * (optional) The URL of an image for an icon to use in the button. * Should not use `icon` property if you are using this property. * * @attribute iconSrc * @type string * @default '' */ iconSrc: '', /** * (optional) Specifies the icon name or index in the set of icons * available in the icon set. If using this property, load the icon * set separately where the icon is used. Should not use `src` * if you are using this property. * * @attribute icon * @type string * @default '' */ icon: '' }, z: 1, attached: function() { if (this.textContent && !this.textContent.match(/\s+/)) { console.warn('Using textContent to label the button is deprecated. Use the "label" property instead'); this.label = this.textContent; } }, activeChanged: function() { this.super(); if (this.active) { // FIXME: remove when paper-ripple can have a default 'down' state. if (!this.lastEvent) { var rect = this.getBoundingClientRect(); this.lastEvent = { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 } } this.$.ripple.downAction(this.lastEvent); } else { this.$.ripple.upAction(); } this.adjustZ(); }, focusedChanged: function() { this.super(); this.adjustZ(); }, disabledChanged: function() { this.super(); this.adjustZ(); }, // waitForSpillCompleted: function(callback) { // this.async(callback, null, (this.$.ink.spillCompleted ? 0 : this.duration)); // }, // resetInk: function() { // this.active = false; // this.$.ink.reset(); // }, insideButton: function(x, y) { var rect = this.getBoundingClientRect(); return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom); }, adjustZ: function() { if (this.focused) { this.classList.add('paper-shadow-animate-z-1-z-2'); } else { this.classList.remove('paper-shadow-animate-z-1-z-2'); if (this.active) { this.z = 2; } else if (this.disabled) { this.z = 0; } else { this.z = 1; } } }, downAction: function(e) { this.super(e); this.lastEvent = e; }, labelChanged: function() { this.setAttribute('aria-label', this.label); } }); </script> </polymer-element>