UNPKG

materialize-angular

Version:
225 lines 17.4 kB
/** * @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==