Permalink
| <!-- | |
| 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 | |
| Material Design: <a href="http://www.google.com/design/spec/components/buttons.html">Buttons</a> | |
| `paper-button` is a button. When the user touches the button, a ripple effect emanates | |
| from the point of contact. It may be flat or raised. A raised button is styled with a | |
| shadow. | |
| Example: | |
| <paper-button>flat button</paper-button> | |
| <paper-button raised>raised button</paper-button> | |
| <paper-button noink>No ripple effect</paper-button> | |
| You may use custom DOM in the button body to create a variety of buttons. For example, to | |
| create a button with an icon and some text: | |
| <paper-button> | |
| <core-icon icon="favorite"></core-icon> | |
| custom button content | |
| </paper-button> | |
| ## Styling | |
| Style the button with CSS as you would a normal DOM element. | |
| /* make #my-button green with yellow text */ | |
| #my-button { | |
| background: green; | |
| color: yellow; | |
| } | |
| By default, the ripple is the same color as the foreground at 25% opacity. You may | |
| customize the color using this selector: | |
| /* make #my-button use a blue ripple instead of foreground color */ | |
| #my-button::shadow #ripple { | |
| color: blue; | |
| } | |
| The opacity of the ripple is not customizable via CSS. | |
| @element paper-button | |
| @extends paper-button-base | |
| @status unstable | |
| --> | |
| <link href="../polymer/polymer.html" rel="import"> | |
| <link href="../paper-shadow/paper-shadow.html" rel="import"> | |
| <link href="../core-a11y-keys/core-a11y-keys.html" rel="import"> | |
| <link href="paper-button-base.html" rel="import"> | |
| <polymer-element name="paper-button" extends="paper-button-base" attributes="raised recenteringTouch fill" | |
| role="button"> | |
| <template> | |
| <style> | |
| :host { | |
| display: inline-block; | |
| position: relative; | |
| box-sizing: border-box; | |
| min-width: 5.14em; | |
| margin: 0 0.29em; | |
| background: transparent; | |
| text-align: center; | |
| font: inherit; | |
| text-transform: uppercase; | |
| outline: none; | |
| border-radius: 3px; | |
| -moz-user-select: none; | |
| -ms-user-select: none; | |
| -webkit-user-select: none; | |
| user-select: none; | |
| cursor: pointer; | |
| z-index: 0; | |
| } | |
| :host([disabled]) { | |
| background: #eaeaea; | |
| color: #a8a8a8; | |
| cursor: auto; | |
| pointer-events: none; | |
| } | |
| ::content * { | |
| text-transform: inherit; | |
| } | |
| #bg, #shadow { | |
| border-radius: inherit; | |
| } | |
| #ripple { | |
| pointer-events: none; | |
| z-index: -1; | |
| } | |
| .button-content { | |
| padding: 0.7em 0.57em | |
| } | |
| polyfill-next-selector { content: '.button-content > a'; } | |
| ::content > a { | |
| height: 100%; | |
| padding: 0.7em 0.57em; | |
| margin: -0.7em -0.57em; | |
| /* flex */ | |
| -ms-flex: 1 1 0.000000001px; | |
| -webkit-flex: 1; | |
| flex: 1; | |
| -webkit-flex-basis: 0.000000001px; | |
| flex-basis: 0.000000001px; | |
| } | |
| </style> | |
| <template if="{{raised}}"> | |
| <paper-shadow id="shadow" fit animated></paper-shadow> | |
| </template> | |
| <!-- this div is needed to position the ripple behind text content --> | |
| <div class="button-content" relative layout horizontal center-center> | |
| <content></content> | |
| </div> | |
| <core-a11y-keys keys="space enter" target="{{}}" on-keys-pressed="{{_activate}}"></core-a11y-keys> | |
| </template> | |
| <script> | |
| Polymer({ | |
| publish: { | |
| /** | |
| * If true, the button will be styled with a shadow. | |
| * | |
| * @attribute raised | |
| * @type boolean | |
| * @default false | |
| */ | |
| raised: false, | |
| /** | |
| * By default the ripple emanates from where the user touched the button. | |
| * Set this to true to always center the ripple. | |
| * | |
| * @attribute recenteringTouch | |
| * @type boolean | |
| * @default false | |
| */ | |
| recenteringTouch: false, | |
| /** | |
| * By default the ripple expands to fill the button. Set this to true to | |
| * constrain the ripple to a circle within the button. | |
| * | |
| * @attribute fill | |
| * @type boolean | |
| * @default true | |
| */ | |
| fill: true | |
| }, | |
| _activate: function() { | |
| this.click(); | |
| this.fire('tap'); | |
| if (!this.pressed) { | |
| var bcr = this.getBoundingClientRect(); | |
| var x = bcr.left + (bcr.width / 2); | |
| var y = bcr.top + (bcr.height / 2); | |
| this.downAction({x: x, y: y}); | |
| var fn = function fn() { | |
| this.upAction(); | |
| this.removeEventListener('keyup', fn); | |
| }.bind(this); | |
| this.addEventListener('keyup', fn); | |
| } | |
| } | |
| }); | |
| </script> | |
| </polymer-element> |