<!--
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>