| Index: third_party/polymer/components/paper-toast/paper-toast.html
|
| diff --git a/third_party/polymer/components/paper-toast/paper-toast.html b/third_party/polymer/components/paper-toast/paper-toast.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..df62e505ae4ba212e2cc769a3b0d66699f35a197
|
| --- /dev/null
|
| +++ b/third_party/polymer/components/paper-toast/paper-toast.html
|
| @@ -0,0 +1,258 @@
|
| +<!--
|
| +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
|
| +-->
|
| +
|
| +<!--
|
| +`paper-toast` provides lightweight feedback about an operation in a small popup
|
| +at the base of the screen on mobile and at the lower left on desktop. Toasts are
|
| +above all other elements on screen, including the FAB.
|
| +
|
| +Toasts automatically disappear after a timeout or after user interaction
|
| +elsewhere on the screen, whichever comes first. Toasts can be swiped off
|
| +screen. There can be only one on the screen at a time.
|
| +
|
| +Example:
|
| +
|
| + <paper-toast text="Your draft has been discarded." onclick="discardDraft(el)"></paper-toast>
|
| +
|
| + <script>
|
| + function discardDraft(el) {
|
| + el.show();
|
| + }
|
| + </script>
|
| +
|
| +An action button can be presented in the toast.
|
| +
|
| +Example (using Polymer's data-binding features):
|
| +
|
| + <paper-toast id="toast2" text="Connection timed out. Showing limited messages.">
|
| + <div style="color: blue;" on-tap="{{retry}}">Retry</div>
|
| + </paper-toast>
|
| +
|
| +Positioning toast:
|
| +
|
| +A standard toast appears near the lower left of the screen. You can change the
|
| +position by overriding bottom and left positions.
|
| +
|
| + paper-toast {
|
| + bottom: 40px;
|
| + left: 10px;
|
| + }
|
| +
|
| +To make it fit at the bottom of the screen:
|
| +
|
| + paper-toast {
|
| + bottom: 0;
|
| + left: 0;
|
| + width: 100%;
|
| + }
|
| +
|
| +When the screen size is smaller than the `responsiveWidth` (default to 480px),
|
| +the toast will automatically fits at the bottom of the screen.
|
| +
|
| +@group Paper Elements
|
| +@element paper-toast
|
| +@homepage github.io
|
| +-->
|
| +
|
| +<link rel="import" href="../core-overlay/core-overlay.html">
|
| +<link rel="import" href="../core-transition/core-transition-css.html">
|
| +<link rel="import" href="../core-media-query/core-media-query.html">
|
| +
|
| +<polymer-element name="paper-toast" attributes="text duration opened responsiveWidth swipeDisabled" role="status">
|
| +
|
| +<template>
|
| +
|
| + <link rel="stylesheet" href="paper-toast.css" >
|
| +
|
| + <core-overlay opened="{{opened}}" target="{{}}" sizingTarget="{{$.container}}" transition="core-transition-bottom"></core-overlay>
|
| +
|
| + <div class="toast-container" horizontal layout>
|
| +
|
| + <div class="toast-text" flex>{{text}}</div>
|
| +
|
| + <div class="toast-text toast-action" on-tap="{{dismiss}}">
|
| + <content></content>
|
| + </div>
|
| +
|
| + </div>
|
| +
|
| + <core-media-query query="max-width: {{responsiveWidth}}" queryMatches="{{narrowMode}}"></core-media-query>
|
| +
|
| +</template>
|
| +<script>
|
| +
|
| + (function() {
|
| +
|
| + var currentToast;
|
| +
|
| + Polymer('paper-toast', {
|
| +
|
| + /**
|
| + * The text shows in a toast.
|
| + *
|
| + * @attribute text
|
| + * @type string
|
| + * @default ''
|
| + */
|
| + text: '',
|
| +
|
| + /**
|
| + * The duration in milliseconds to show the toast.
|
| + *
|
| + * @attribute duration
|
| + * @type number
|
| + * @default 3000
|
| + */
|
| + duration: 3000,
|
| +
|
| + /**
|
| + * Set opened to true to show the toast and to false to hide it.
|
| + *
|
| + * @attribute opened
|
| + * @type boolean
|
| + * @default false
|
| + */
|
| + opened: false,
|
| +
|
| + /**
|
| + * Min-width when the toast changes to narrow layout. In narrow layout,
|
| + * the toast fits at the bottom of the screen when opened.
|
| + *
|
| + * @attribute responsiveWidth
|
| + * @type string
|
| + * @default '480px'
|
| + */
|
| + responsiveWidth: '480px',
|
| +
|
| + /**
|
| + * If true, the toast can't be swiped.
|
| + *
|
| + * @attribute swipeDisabled
|
| + * @type boolean
|
| + * @default false
|
| + */
|
| + swipeDisabled: false,
|
| +
|
| + eventDelegates: {
|
| + trackstart: 'trackStart',
|
| + track: 'track',
|
| + trackend: 'trackEnd',
|
| + transitionend: 'transitionEnd'
|
| + },
|
| +
|
| + narrowModeChanged: function() {
|
| + this.classList.toggle('fit-bottom', this.narrowMode);
|
| + },
|
| +
|
| + openedChanged: function() {
|
| + if (this.opened) {
|
| + this.dismissJob = this.job(this.dismissJob, this.dismiss, this.duration);
|
| + } else {
|
| + this.dismissJob && this.dismissJob.stop();
|
| + this.dismiss();
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Toggle the opened state of the toast.
|
| + * @method toggle
|
| + */
|
| + toggle: function() {
|
| + this.opened = !this.opened;
|
| + },
|
| +
|
| + /**
|
| + * Show the toast for the specified duration
|
| + * @method show
|
| + */
|
| + show: function() {
|
| + if (currentToast) {
|
| + currentToast.dismiss();
|
| + }
|
| + currentToast = this;
|
| + this.opened = true;
|
| + },
|
| +
|
| + /**
|
| + * Dismiss the toast and hide it.
|
| + * @method dismiss
|
| + */
|
| + dismiss: function() {
|
| + if (this.dragging) {
|
| + this.shouldDismiss = true;
|
| + } else {
|
| + this.opened = false;
|
| + if (currentToast === this) {
|
| + currentToast = null;
|
| + }
|
| + }
|
| + },
|
| +
|
| + trackStart: function(e) {
|
| + if (!this.swipeDisabled) {
|
| + e.preventTap();
|
| + this.vertical = e.yDirection;
|
| + this.w = this.offsetWidth;
|
| + this.h = this.offsetHeight;
|
| + this.dragging = true;
|
| + this.classList.add('dragging');
|
| + }
|
| + },
|
| +
|
| + track: function(e) {
|
| + if (this.dragging) {
|
| + var s = this.style;
|
| + if (this.vertical) {
|
| + var y = e.dy;
|
| + s.opacity = (this.h - Math.abs(y)) / this.h;
|
| + s.webkitTransform = s.transform = 'translate3d(0, ' + y + 'px, 0)';
|
| + } else {
|
| + var x = e.dx;
|
| + s.opacity = (this.w - Math.abs(x)) / this.w;
|
| + s.webkitTransform = s.transform = 'translate3d(' + x + 'px, 0, 0)';
|
| + }
|
| + }
|
| + },
|
| +
|
| + trackEnd: function(e) {
|
| + if (this.dragging) {
|
| + this.classList.remove('dragging');
|
| + this.style.opacity = null;
|
| + this.style.webkitTransform = this.style.transform = null;
|
| + var cl = this.classList;
|
| + if (this.vertical) {
|
| + cl.toggle('fade-out-down', e.yDirection === 1 && e.dy > 0);
|
| + cl.toggle('fade-out-up', e.yDirection === -1 && e.dy < 0);
|
| + } else {
|
| + cl.toggle('fade-out-right', e.xDirection === 1 && e.dx > 0);
|
| + cl.toggle('fade-out-left', e.xDirection === -1 && e.dx < 0);
|
| + }
|
| + this.dragging = false;
|
| + }
|
| + },
|
| +
|
| + transitionEnd: function() {
|
| + var cl = this.classList;
|
| + if (cl.contains('fade-out-right') || cl.contains('fade-out-left') ||
|
| + cl.contains('fade-out-down') || cl.contains('fade-out-up')) {
|
| + this.dismiss();
|
| + cl.remove('fade-out-right', 'fade-out-left',
|
| + 'fade-out-down', 'fade-out-up');
|
| + } else if (this.shouldDismiss) {
|
| + this.dismiss();
|
| + }
|
| + this.shouldDismiss = false;
|
| + }
|
| +
|
| + });
|
| +
|
| + })();
|
| +
|
| +</script>
|
| +</polymer-element>
|
|
|