!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/material/core"),require("@angular/cdk/a11y"),require("@angular/cdk/coercion"),require("@angular/platform-browser/animations")):"function"==typeof define&&define.amd?define("@angular/material/badge",["exports","@angular/core","@angular/material/core","@angular/cdk/a11y","@angular/cdk/coercion","@angular/platform-browser/animations"],t):t(((e=e||self).ng=e.ng||{},e.ng.material=e.ng.material||{},e.ng.material.badge={}),e.ng.core,e.ng.material.core,e.ng.cdk.a11y,e.ng.cdk.coercion,e.ng.platformBrowser.animations)}(this,(function(e,t,n,r,a,o){"use strict";
/*! *****************************************************************************
    Copyright (c) Microsoft Corporation.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted.

    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
    PERFORMANCE OF THIS SOFTWARE.
    ***************************************************************************** */var i,s=function(e,t){return(s=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)},c=0,d=function(e){function t(t,n,r,a,o){var i=e.call(this)||this;return i._ngZone=t,i._elementRef=n,i._ariaDescriber=r,i._renderer=a,i._animationMode=o,i._hasContent=!1,i._color="primary",i._overlap=!0,i.position="above after",i.size="medium",i._id=c++,i}return function n(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}s(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}(t,e),Object.defineProperty(t.prototype,"color",{get:function(){return this._color},set:function(e){this._setColor(e),this._color=e},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"overlap",{get:function(){return this._overlap},set:function(e){this._overlap=a.coerceBooleanProperty(e)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"description",{get:function(){return this._description},set:function(e){if(e!==this._description){var t=this._badgeElement;this._updateHostAriaDescription(e,this._description),this._description=e,t&&(e?t.setAttribute("aria-label",e):t.removeAttribute("aria-label"))}},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"hidden",{get:function(){return this._hidden},set:function(e){this._hidden=a.coerceBooleanProperty(e)},enumerable:!1,configurable:!0}),t.prototype.isAbove=function(){return-1===this.position.indexOf("below")},t.prototype.isAfter=function(){return-1===this.position.indexOf("before")},t.prototype.ngOnChanges=function(e){var t=e.content;if(t){var n=t.currentValue;this._hasContent=null!=n&&(""+n).trim().length>0,this._updateTextContent()}},t.prototype.ngOnDestroy=function(){var e=this._badgeElement;e&&(this.description&&this._ariaDescriber.removeDescription(e,this.description),this._renderer.destroyNode&&this._renderer.destroyNode(e))},t.prototype.getBadgeElement=function(){return this._badgeElement},t.prototype._updateTextContent=function(){return this._badgeElement?this._badgeElement.textContent=this._stringifyContent():this._badgeElement=this._createBadgeElement(),this._badgeElement},t.prototype._createBadgeElement=function(){var e=this._renderer.createElement("span");return this._clearExistingBadges("mat-badge-content"),e.setAttribute("id","mat-badge-content-"+this._id),e.classList.add("mat-badge-content"),e.textContent=this._stringifyContent(),"NoopAnimations"===this._animationMode&&e.classList.add("_mat-animation-noopable"),this.description&&e.setAttribute("aria-label",this.description),this._elementRef.nativeElement.appendChild(e),"function"==typeof requestAnimationFrame&&"NoopAnimations"!==this._animationMode?this._ngZone.runOutsideAngular((function(){requestAnimationFrame((function(){e.classList.add("mat-badge-active")}))})):e.classList.add("mat-badge-active"),e},t.prototype._updateHostAriaDescription=function(e,t){var n=this._updateTextContent();t&&this._ariaDescriber.removeDescription(n,t),e&&this._ariaDescriber.describe(n,e)},t.prototype._setColor=function(e){if(e!==this._color){var t=this._elementRef.nativeElement.classList;this._color&&t.remove("mat-badge-"+this._color),e&&t.add("mat-badge-"+e)}},t.prototype._clearExistingBadges=function(e){for(var t=this._elementRef.nativeElement,n=t.children.length;n--;){var r=t.children[n];r.classList.contains(e)&&t.removeChild(r)}},t.prototype._stringifyContent=function(){var e=this.content;return null==e?"":""+e},t}(n.mixinDisabled((function l(){})));d.decorators=[{type:t.Directive,args:[{selector:"[matBadge]",inputs:["disabled: matBadgeDisabled"],host:{class:"mat-badge","[class.mat-badge-overlap]":"overlap","[class.mat-badge-above]":"isAbove()","[class.mat-badge-below]":"!isAbove()","[class.mat-badge-before]":"!isAfter()","[class.mat-badge-after]":"isAfter()","[class.mat-badge-small]":'size === "small"',"[class.mat-badge-medium]":'size === "medium"',"[class.mat-badge-large]":'size === "large"',"[class.mat-badge-hidden]":"hidden || !_hasContent","[class.mat-badge-disabled]":"disabled"}}]}],d.ctorParameters=function(){return[{type:t.NgZone},{type:t.ElementRef},{type:r.AriaDescriber},{type:t.Renderer2},{type:String,decorators:[{type:t.Optional},{type:t.Inject,args:[o.ANIMATION_MODULE_TYPE]}]}]},d.propDecorators={color:[{type:t.Input,args:["matBadgeColor"]}],overlap:[{type:t.Input,args:["matBadgeOverlap"]}],position:[{type:t.Input,args:["matBadgePosition"]}],content:[{type:t.Input,args:["matBadge"]}],description:[{type:t.Input,args:["matBadgeDescription"]}],size:[{type:t.Input,args:["matBadgeSize"]}],hidden:[{type:t.Input,args:["matBadgeHidden"]}]},(i=function i(){}).decorators=[{type:t.NgModule,args:[{imports:[r.A11yModule,n.MatCommonModule],exports:[d,n.MatCommonModule],declarations:[d]}]}],
/**
     * @license
     * Copyright Google LLC 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://angular.io/license
     */
e.MatBadge=d,e.MatBadgeModule=i,Object.defineProperty(e,"__esModule",{value:!0})}));