blob: eb9535ccb617b6e6b1eaae0dee8fcc940fc84dc5 [file] [log] [blame]
/**
@license
Copyright (c) 2015 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
*/
import '../iron-flex-layout/iron-flex-layout.js';
import '../paper-styles/element-styles/paper-material-styles.js';
import {PaperButtonBehavior, PaperButtonBehaviorImpl} from '../paper-behaviors/paper-button-behavior.js';
import {Polymer} from '../polymer/lib/legacy/polymer-fn.js';
import {html} from '../polymer/polymer-legacy.js';
const template = html`
<style include="paper-material-styles">
/* Need to specify the same specificity as the styles imported from paper-material. */
:host {
@apply --layout-inline;
@apply --layout-center-center;
position: relative;
box-sizing: border-box;
min-width: 5.14em;
margin: 0 0.29em;
background: transparent;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-tap-highlight-color: transparent;
font: inherit;
text-transform: uppercase;
outline-width: 0;
border-radius: 3px;
-moz-user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
user-select: none;
cursor: pointer;
z-index: 0;
padding: 0.7em 0.57em;
@apply --paper-font-common-base;
@apply --paper-button;
}
:host([elevation="1"]) {
@apply --paper-material-elevation-1;
}
:host([elevation="2"]) {
@apply --paper-material-elevation-2;
}
:host([elevation="3"]) {
@apply --paper-material-elevation-3;
}
:host([elevation="4"]) {
@apply --paper-material-elevation-4;
}
:host([elevation="5"]) {
@apply --paper-material-elevation-5;
}
:host([hidden]) {
display: none !important;
}
:host([raised].keyboard-focus) {
font-weight: bold;
@apply --paper-button-raised-keyboard-focus;
}
:host(:not([raised]).keyboard-focus) {
font-weight: bold;
@apply --paper-button-flat-keyboard-focus;
}
:host([disabled]) {
background: none;
color: #a8a8a8;
cursor: auto;
pointer-events: none;
@apply --paper-button-disabled;
}
:host([disabled][raised]) {
background: #eaeaea;
}
:host([animated]) {
@apply --shadow-transition;
}
paper-ripple {
color: var(--paper-button-ink-color);
}
</style>
<slot></slot>`;
template.setAttribute('strip-whitespace', '');
/**
Material design:
[Buttons](https://www.google.com/design/spec/components/buttons.html)
`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>
<paper-button toggles>Toggle-able button</paper-button>
A button that has `toggles` true will remain `active` after being clicked (and
will have an `active` attribute set). For more information, see the
`IronButtonState` behavior.
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>
<iron-icon icon="favorite"></iron-icon>
custom button content
</paper-button>
To use `paper-button` as a link, wrap it in an anchor tag. Since `paper-button`
will already receive focus, you may want to prevent the anchor tag from
receiving focus as well by setting its tabindex to -1.
<a href="https://www.polymer-project.org/" tabindex="-1">
<paper-button raised>Polymer Project</paper-button>
</a>
### Styling
Style the button with CSS as you would a normal DOM element.
paper-button.fancy {
background: green;
color: yellow;
}
paper-button.fancy:hover {
background: lime;
}
paper-button[disabled],
paper-button[toggles][active] {
background: red;
}
By default, the ripple is the same color as the foreground at 25% opacity. You
may customize the color using the `--paper-button-ink-color` custom property.
The following custom properties and mixins are also available for styling:
Custom property | Description | Default
----------------|-------------|----------
`--paper-button-ink-color` | Background color of the ripple | `Based on the button's color`
`--paper-button` | Mixin applied to the button | `{}`
`--paper-button-disabled` | Mixin applied to the disabled button. Note that you can also use the `paper-button[disabled]` selector | `{}`
`--paper-button-flat-keyboard-focus` | Mixin applied to a flat button after it's been focused using the keyboard | `{}`
`--paper-button-raised-keyboard-focus` | Mixin applied to a raised button after it's been focused using the keyboard | `{}`
@demo demo/index.html
*/
Polymer({
_template: template,
is: 'paper-button',
behaviors: [PaperButtonBehavior],
properties: {
/**
* If true, the button should be styled with a shadow.
*/
raised: {
type: Boolean,
reflectToAttribute: true,
value: false,
observer: '_calculateElevation',
}
},
_calculateElevation: function() {
if (!this.raised) {
this._setElevation(0);
} else {
PaperButtonBehaviorImpl._calculateElevation.apply(this);
}
}
/**
Fired when the animation finishes.
This is useful if you want to wait until
the ripple animation finishes to perform some action.
@event transitionend
Event param: {{node: Object}} detail Contains the animated node.
*/
});