materialize-angular
Version:
Material UI Angular library
225 lines • 17.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: app/completed-components/common/ripple.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Workylab. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://raw.githubusercontent.com/workylab/materialize-angular/master/LICENSE
*/
import { Directive, ElementRef, HostListener, Input, Renderer2 } from '@angular/core';
import { config } from '../../config';
/**
* @record
*/
function Coordinate() { }
if (false) {
/** @type {?} */
Coordinate.prototype.x;
/** @type {?} */
Coordinate.prototype.y;
}
export class RippleDirective {
/**
* @param {?} elementRef
* @param {?} renderer
*/
constructor(elementRef, renderer) {
this.elementRef = elementRef;
this.renderer = renderer;
this.rippleDuration = 500;
this.isRippleActive = true;
this.isRippleCenter = false;
this.prefix = config.components.prefix;
this.createRipple = this.createRipple.bind(this);
this.element = this.elementRef.nativeElement;
this.renderer.addClass(this.element, `${this.prefix}-ripple-element`);
}
/**
* @return {?}
*/
ngOnInit() {
if (!this.isRippleActive) {
this.renderer.addClass(this.element, 'disabled');
}
}
/**
* @param {?} event
* @return {?}
*/
createRipple(event) {
if (!this.isRippleActive) {
return;
}
/** @type {?} */
const coordinates = this.isRippleCenter
? this.getCoordinatesByCenter()
: this.getCoordinatesByEvent(event);
/** @type {?} */
const radio = this.getRippleRadio(coordinates);
this.renderRipple(radio, coordinates);
}
/**
* @param {?} radio
* @param {?} coordinate
* @return {?}
*/
renderRipple(radio, coordinate) {
/** @type {?} */
const ripple = this.renderer.createElement('div');
/** @type {?} */
const centerY = coordinate.y - radio;
/** @type {?} */
const centerX = coordinate.x - radio;
this.renderer.addClass(ripple, 'ripple');
this.renderer.setStyle(ripple, 'height', `${radio * 2}px`);
this.renderer.setStyle(ripple, 'width', `${radio * 2}px`);
this.renderer.setStyle(ripple, 'top', `${centerY}px`);
this.renderer.setStyle(ripple, 'left', `${centerX}px`);
this.renderer.insertBefore(this.element, ripple, this.element.firstChild);
this.scaleRipple(ripple);
}
/**
* @return {?}
*/
getCoordinatesByCenter() {
const { offsetHeight, offsetWidth } = this.element;
/** @type {?} */
const y = offsetHeight / 2;
/** @type {?} */
const x = offsetWidth / 2;
return { x, y };
}
/**
* @param {?} event
* @return {?}
*/
getCoordinatesByEvent(event) {
/** @type {?} */
const offset = this.getOffset(this.element);
/** @type {?} */
const y = event.pageY - offset.top;
/** @type {?} */
const x = event.pageX - offset.left;
return { x, y };
}
/**
* @param {?} coordinate
* @return {?}
*/
getRippleRadio(coordinate) {
/** @type {?} */
const height = Math.max(this.element.offsetHeight - coordinate.y, coordinate.y);
/** @type {?} */
const width = Math.max(this.element.offsetWidth - coordinate.x, coordinate.x);
/** @type {?} */
const radio = Math.hypot(height, width);
return radio;
}
/**
* @param {?} ripple
* @return {?}
*/
scaleRipple(ripple) {
setTimeout((/**
* @return {?}
*/
() => {
ripple.style.transitionDuration = `${this.rippleDuration}ms`;
ripple.style.transform = 'scale(1)';
this.hideRipple(ripple);
}), 0);
}
/**
* @param {?} ripple
* @return {?}
*/
hideRipple(ripple) {
setTimeout((/**
* @return {?}
*/
() => {
this.renderer.setStyle(ripple, 'transitionDuration', `${this.rippleDuration}ms`);
this.renderer.setStyle(ripple, 'opacity', '0');
this.removeRipple(ripple);
}), this.rippleDuration);
}
/**
* @param {?} ripple
* @return {?}
*/
removeRipple(ripple) {
setTimeout((/**
* @return {?}
*/
() => {
this.renderer.removeChild(this.element, ripple);
}), this.rippleDuration);
}
/**
* @param {?} element
* @return {?}
*/
getOffset(element) {
/** @type {?} */
const rect = element.getBoundingClientRect();
/** @type {?} */
const top = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
/** @type {?} */
const left = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
/** @type {?} */
const offset = {
left: rect.left + left,
top: rect.top + top
};
return offset;
}
}
RippleDirective.decorators = [
{ type: Directive, args: [{
selector: `[${config.components.prefix}Ripple]`
},] }
];
/** @nocollapse */
RippleDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 }
];
RippleDirective.propDecorators = {
rippleDuration: [{ type: Input }],
isRippleActive: [{ type: Input }],
isRippleCenter: [{ type: Input }],
createRipple: [{ type: HostListener, args: ['mousedown', ['$event'],] }]
};
if (false) {
/** @type {?} */
RippleDirective.prototype.rippleDuration;
/** @type {?} */
RippleDirective.prototype.isRippleActive;
/** @type {?} */
RippleDirective.prototype.isRippleCenter;
/**
* @type {?}
* @private
*/
RippleDirective.prototype.element;
/**
* @type {?}
* @private
*/
RippleDirective.prototype.prefix;
/**
* @type {?}
* @private
*/
RippleDirective.prototype.elementRef;
/**
* @type {?}
* @private
*/
RippleDirective.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdGVyaWFsaXplLWFuZ3VsYXIvIiwic291cmNlcyI6WyJhcHAvY29tcGxldGVkLWNvbXBvbmVudHMvY29tbW9uL3JpcHBsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQzs7OztBQUV0Qyx5QkFHQzs7O0lBRkMsdUJBQVU7O0lBQ1YsdUJBQVU7O0FBTVosTUFBTSxPQUFPLGVBQWU7Ozs7O0lBUTFCLFlBQW9CLFVBQXNCLEVBQVUsUUFBbUI7UUFBbkQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFQOUQsbUJBQWMsR0FBRyxHQUFHLENBQUM7UUFDckIsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFHeEIsV0FBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBR3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUksSUFBSSxDQUFDLE1BQU8saUJBQWlCLENBQUMsQ0FBQztJQUMxRSxDQUFDOzs7O0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FB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SUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDOztjQUM5RixJQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDOztjQUVqRyxNQUFNLEdBQUc7WUFDYixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJO1lBQ3RCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUc7U0FDcEI7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzs7WUFwSEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxJQUFLLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTyxTQUFTO2FBQ2xEOzs7O1lBVm1CLFVBQVU7WUFBK0IsU0FBUzs7OzZCQVluRSxLQUFLOzZCQUNMLEtBQUs7NkJBQ0wsS0FBSzsyQkFrQkwsWUFBWSxTQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7OztJQXBCckMseUNBQThCOztJQUM5Qix5Q0FBK0I7O0lBQy9CLHlDQUFnQzs7Ozs7SUFFaEMsa0NBQTZCOzs7OztJQUM3QixpQ0FBMEM7Ozs7O0lBRTlCLHFDQUE4Qjs7Ozs7SUFBRSxtQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgV29ya3lsYWIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3dvcmt5bGFiL21hdGVyaWFsaXplLWFuZ3VsYXIvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnO1xuXG5pbnRlcmZhY2UgQ29vcmRpbmF0ZSB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IGBbJHsgY29uZmlnLmNvbXBvbmVudHMucHJlZml4IH1SaXBwbGVdYFxufSlcbmV4cG9ydCBjbGFzcyBSaXBwbGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSByaXBwbGVEdXJhdGlvbiA9IDUwMDtcbiAgQElucHV0KCkgaXNSaXBwbGVBY3RpdmUgPSB0cnVlO1xuICBASW5wdXQoKSBpc1JpcHBsZUNlbnRlciA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcHJlZml4ID0gY29uZmlnLmNvbXBvbmVudHMucHJlZml4O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gICAgdGhpcy5jcmVhdGVSaXBwbGUgPSB0aGlzLmNyZWF0ZVJpcHBsZS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnQsIGAkeyB0aGlzLnByZWZpeCB9LXJpcHBsZS1lbGVtZW50YCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNSaXBwbGVBY3RpdmUpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50LCAnZGlzYWJsZWQnKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBjcmVhdGVSaXBwbGUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1JpcHBsZUFjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gdGhpcy5pc1JpcHBsZUNlbnRlclxuICAgICAgPyB0aGlzLmdldENvb3JkaW5hdGVzQnlDZW50ZXIoKVxuICAgICAgOiB0aGlzLmdldENvb3JkaW5hdGVzQnlFdmVudChldmVudCk7XG5cbiAgICBjb25zdCByYWRpbyA9IHRoaXMuZ2V0UmlwcGxlUmFkaW8oY29vcmRpbmF0ZXMpO1xuXG4gICAgdGhpcy5yZW5kZXJSaXBwbGUocmFkaW8sIGNvb3JkaW5hdGVzKTtcbiAgfVxuXG4gIHJlbmRlclJpcHBsZShyYWRpbzogbnVtYmVyLCBjb29yZGluYXRlOiBDb29yZGluYXRlKSB7XG4gICAgY29uc3QgcmlwcGxlID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBjZW50ZXJZID0gY29vcmRpbmF0ZS55IC0gcmFkaW87XG4gICAgY29uc3QgY2VudGVyWCA9IGNvb3JkaW5hdGUueCAtIHJhZGlvO1xuXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhyaXBwbGUsICdyaXBwbGUnKTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocmlwcGxlLCAnaGVpZ2h0JywgYCR7IHJhZGlvICogMiB9cHhgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJpcHBsZSwgJ3dpZHRoJywgYCR7IHJhZGlvICogMiB9cHhgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJpcHBsZSwgJ3RvcCcsIGAkeyBjZW50ZXJZIH1weGApO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocmlwcGxlLCAnbGVmdCcsIGAkeyBjZW50ZXJYIH1weGApO1xuICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgcmlwcGxlLCB0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZCk7XG5cbiAgICB0aGlzLnNjYWxlUmlwcGxlKHJpcHBsZSk7XG4gIH1cblxuICBnZXRDb29yZGluYXRlc0J5Q2VudGVyKCkge1xuICAgIGNvbnN0IHsgb2Zmc2V0SGVpZ2h0LCBvZmZzZXRXaWR0aCB9ID0gdGhpcy5lbGVtZW50O1xuICAgIGNvbnN0IHkgPSBvZmZzZXRIZWlnaHQgLyAyO1xuICAgIGNvbnN0IHggPSBvZmZzZXRXaWR0aCAvIDI7XG5cbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH1cblxuICBnZXRDb29yZGluYXRlc0J5RXZlbnQoZXZlbnQ6IGFueSk6IENvb3JkaW5hdGUge1xuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuZ2V0T2Zmc2V0KHRoaXMuZWxlbWVudCk7XG5cbiAgICBjb25zdCB5ID0gZXZlbnQucGFnZVkgLSBvZmZzZXQudG9wO1xuICAgIGNvbnN0IHggPSBldmVudC5wYWdlWCAtIG9mZnNldC5sZWZ0O1xuXG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG5cbiAgZ2V0UmlwcGxlUmFkaW8oY29vcmRpbmF0ZTogQ29vcmRpbmF0ZSk6IG51bWJlciB7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAtIGNvb3JkaW5hdGUueSwgY29vcmRpbmF0ZS55KTtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCAtIGNvb3JkaW5hdGUueCwgY29vcmRpbmF0ZS54KTtcblxuICAgIGNvbnN0IHJhZGlvID0gTWF0aC5oeXBvdChoZWlnaHQsIHdpZHRoKTtcblxuICAgIHJldHVybiByYWRpbztcbiAgfVxuXG4gIHNjYWxlUmlwcGxlKHJpcHBsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJpcHBsZS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBgJHsgdGhpcy5yaXBwbGVEdXJhdGlvbiB9bXNgO1xuICAgICAgcmlwcGxlLnN0eWxlLnRyYW5zZm9ybSA9ICdzY2FsZSgxKSc7XG5cbiAgICAgIHRoaXMuaGlkZVJpcHBsZShyaXBwbGUpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgaGlkZVJpcHBsZShyaXBwbGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJpcHBsZSwgJ3RyYW5zaXRpb25EdXJhdGlvbicsIGAkeyB0aGlzLnJpcHBsZUR1cmF0aW9uIH1tc2ApO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyaXBwbGUsICdvcGFjaXR5JywgJzAnKTtcblxuICAgICAgdGhpcy5yZW1vdmVSaXBwbGUocmlwcGxlKTtcbiAgICB9LCB0aGlzLnJpcHBsZUR1cmF0aW9uKTtcbiAgfVxuXG4gIHJlbW92ZVJpcHBsZShyaXBwbGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCwgcmlwcGxlKTtcbiAgICB9LCB0aGlzLnJpcHBsZUR1cmF0aW9uKTtcbiAgfVxuXG4gIGdldE9mZnNldChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIHx8IDA7XG4gICAgY29uc3QgbGVmdCA9IHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgfHwgMDtcblxuICAgIGNvbnN0IG9mZnNldCA9IHtcbiAgICAgIGxlZnQ6IHJlY3QubGVmdCArIGxlZnQsXG4gICAgICB0b3A6IHJlY3QudG9wICsgdG9wXG4gICAgfTtcblxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cbn1cbiJdfQ==